Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 提供traits类的类型的模板专门化_C++_Templates - Fatal编程技术网

C++ 提供traits类的类型的模板专门化

C++ 提供traits类的类型的模板专门化,c++,templates,C++,Templates,我有一节课 template <typename T> struct Dispatch; 这可能吗?使用boost 如果boost不可用,请查看。刚刚找到它: template <typename T, class Enable = void> struct Dispatch; template <typename T> struct Dispatch<T, typename boost::enable_if< typename IsArrayT

我有一节课

template <typename T> struct Dispatch;
这可能吗?

使用boost

如果boost不可用,请查看。

刚刚找到它:

template <typename T, class Enable = void> struct Dispatch;
template <typename T>
struct Dispatch<T, typename boost::enable_if< typename IsArrayType<T>::type>::type>
{
};
模板结构分派;
模板
结构分派::类型>
{
};

多亏了Kornel。

traits背后的思想是,您可以提供一个默认实现,类型可以选择性地专门化它。这样,在使用特征的代码中就没有特殊情况了。您的方法(为定义了trait和未定义trait的类提供特殊情况)违背了类型trait的目的。

从C++14开始,这是标准化的。

对于C++14之后的编译器,更喜欢std::enable_if(请参见下文)。实际上,您现在可以使用“if constexpr()”来做一个更好的解决方案:PGood point,我们不支持C++17,但这看起来是一个更好的选择。
 template <> struct Dispatch <enable_if<IsArrayType>>
 {
   template <typename ArrayType>
   static void Apply (void* a, ArrayType& m)
   {
     ::memcpy (a, &m, ArrayTypeTraits<ArrayType>::GetSize (m));
   }
 };
template <typename T, class Enable = void> struct Dispatch;
template <typename T>
struct Dispatch<T, typename boost::enable_if< typename IsArrayType<T>::type>::type>
{
};