我在玩与C ++ 17,我有一个std::tuple
的const &T
类型。例如:
template <typename... members>
auto make_cr_tuple(members const &...args) -> decltype(auto) {
return std::make_tuple(std::cref(args)...);
}
int main() {
std::string s;
int i = 0;
auto crt = make_cr_tuple(s, i); // std::tuple<const std::string &, const int &>
}
我想要一种声明每个值类型的元组,删除const和引用限定符的方法。例如,也许是这样的:
using decayed = decayed_tuple<decltype(crt)>::type
我想我可以使用类似的方法,但这还不够。
template <typename T>
struct decayed_tuple {
using type = decltype(std::apply(std::make_tuple, T{}));
};
显然,这是行不通的,因为这make_tuple
是一个未解决的重载函数。
我确实需要std::make_tuple<???>
,但我不知道如何将类型从T
模板包中获取。请注意,我假设T
这里是默认可构造的。
也许您可以如下声明(不需要定义)一个函数
template <typename ... Ts>
constexpr auto decay_types (std::tuple<Ts...> const &)
-> std::tuple<std::remove_cv_t<std::remove_reference_t<Ts>>...>;
并通过std::declval()
和使用它decltype()
。
也许您也可以添加using
别名以简化工作
template <typename T>
using decay_tuple = decltype(decay_types(std::declval<T>()));
一个完整的例子
#include <tuple>
#include <type_traits>
template <typename ... Ts>
constexpr auto decay_types (std::tuple<Ts...> const &)
-> std::tuple<std::remove_cv_t<std::remove_reference_t<Ts>>...>;
template <typename T>
using decay_tuple = decltype(decay_types(std::declval<T>()));
int main()
{
using T1 = std::tuple<int const &, long const &, long long const &>;
using T2 = decay_tuple<T1>;
static_assert( std::is_same_v<T2, std::tuple<int, long, long long>>, "!");
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句