有没有一种方法可以根据模板参数的类型在不同的类实现之间进行选择?

时间:2019-07-13 11:08:52

标签: c++ templates

例如,我想创建一个数组。该数组接受要处理的类型作为模板参数。现在,如果类型是原始类型(int,double,short),则可以使用浅表副本,而如果是类,则需要使用该类的副本构造函数。如果这是简单的方法之一,则可以在返回值上将SFAINE与std :: enable_if一起使用,但对于构​​造函数则不是这种情况。

我尝试了以下操作,但GCC-9给出了编译错误:

template< typename Type, typename std::enable_if< std::is_integral< Type >::value() >::type* = nullptr >
class Array
{
    ...Implementation...
}

template< typename Type, typename std::enable_if< std::is_integral< Type >::value() == false >::type* = nullptr >
class Array
{
    ...Implementation 2...
}

此外,我尝试使用默认构造函数,但GCC-9仍然不满意:

template< typename Type >
class Array
{

    Array( typename std::enable_if< std::is_integral< Type >::value() >::type* = nullptr )
    {}

    Array( typename std::enable_if< std::is_integral< Type >::value() == false >::type* = nullptr )
    {}

}

是否有一种方法可以根据给定的模板参数的类型来创建具有不同实现的同名类?

如果我告诉我错了,我会删除一些问题,但我认为并非完全如此

2 个答案:

答案 0 :(得分:3)

要感谢SFINAE,要专门化的原因是要有一个模板参数:

template<typename Type, typename Enabler = void> class Array;

template<typename Type>
class Array<Type, typename std::enable_if<std::is_integral< Type >::value() >::type>
{
    // ...Implementation 1...
};

template<typename Type>
class Array<Type, typename std::enable_if<!std::is_integral< Type >::value() >::type>
{
    // ...Implementation 2...
};

答案 1 :(得分:1)

您可以在方法内部的常规is_integral块中使用if

#include <type_traits>

template <typename Type>
class Array
{
    // Implementation
}

template <typename Type>
Array::someMethod()
{
    if (std::is_integral<Type>::value)
    {
        // Your shallow copy
    }
    else
    {
        // Your copy constructor
    }
}

您还可以通过以下方式专门化:

template <typename Type>
Array::someMethod()
{
    // Your copy constructor
}

template <>
Array<int>::someMethod()
{
    // Your shallow copy
}

但是,这样一来,您将必须为要浅拷贝的每种类型创建其他方法。为了优化起见,您只能使用一种方法进行浅表复制,并且所有专门的方法都将其称为该浅表复制方法。