检测类型是否为零元素数组?

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但是我可以用什么技巧来检测零元素数组?

(我正在寻找一种不需要创建另一个函数或类的解决方案,......)

Dan*_*rey 6

您可以使用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指针等.

  • @Vincent:没有额外的功能或类,我不知道如何描述你的情况*没有*使用"注定"这个词...... (2认同)
  • @Vincent:虽然......究竟*可以*`Type`是什么?什么?或者只有一组有限的其他类型?请澄清这个游戏的规则:) (2认同)