首页 > 解决方案 > 有没有办法根据模板参数的类型在不同的类实现之间进行选择?

问题描述

例如,我想创建一个数组。数组接受要处理的类型作为模板参数。现在,如果类型是原始类型(int、double、short),则可以使用浅拷贝,而如果它是类,则需要使用类的复制构造函数。如果它是一种简单的方法,我可以在返回值上使用带有 std::enable_if 的 SFAINE,但构造函数并非如此。

我尝试了以下方法,但 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 )
    {}

}

有没有办法根据给定的模板参数的类型创建一个具有不同实现的同名类?

似乎有类似的问题,但我认为不完全是,如果我错了告诉我,我会删除问题

标签: c++templates

解决方案


借助 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...
};

推荐阅读