Vin*_*ent 3 c++ arrays templates type-traits c++11
考虑以下功能:
template <typename Type>
void f(const Type& x)
Run Code Online (Sandbox Code Playgroud)
无论传递的类型是空std::tuple
还是空,我都想做一些特殊的事情(没有特化)std::array
.对于nu元素的元组,我可以使用std::is_same<Type, std::tuple<>>::value
但是我可以用什么技巧来检测零元素数组?
(我正在寻找一种不需要创建另一个函数或类的解决方案,......)
您可以使用std::tuple_size
,因为它也适用std::array
!看到这里.只需使用:
std::tuple_size<Type>::value == 0
Run Code Online (Sandbox Code Playgroud)
检查Type
是空std::tuple<>
还是空std::array<T,0>
.
有了上述内容,问题仍然是如果Type
既不是a也std::tuple
不会发生std::array
.我看到的一般方法是这样的:
constexpr bool IsNotTupleOrArray =
!std::is_class<Type>::value ||
std::is_same<Type,ExcludeThisClass>::value ||
sizeof(Type)>1 || // non-portable, works for GCC 4.8+
...;
std::conditional< IsNotTupleOrArray,
std::false_type,
std::tuple_size<Type> >::type::value;
Run Code Online (Sandbox Code Playgroud)
这基本上意味着你必须明确排除其他类型.例如,is_class<Type>
排除所有基本类型,如int
指针等.
归档时间: |
|
查看次数: |
340 次 |
最近记录: |