构造函数的部分模板专门化

时间:2020-05-24 20:22:59

标签: c++ templates

我需要一个看起来像这样的课:

template<typename T, class S, size_t C>
class myClass
{
public:
    myClass(); // Ctor

    /*


    */
private:
S myData;
}

其中T是存储数据的类型,S是容器类型,C是它的大小。方法不依赖于容器的类型,但是我仍然需要正确地初始化S。例如,让S为std::vector,我尝试过:

template<typename T, size_t C>
myClass<T, std::vector<T>, C>::myClass()
{

}

但是我遇到E0040 expected identifier错误。

1 个答案:

答案 0 :(得分:1)

您不能对方法进行部分专业化,可以对整个类进行部分专业化,但是需要一些重复。

由于可以使用C ++ 17,因此可以对实现进行调整:

template<typename T, class S, size_t C>
myClass<T, S, C>::myClass()
{
    if constexpr (std::is_same_v<S, std::vector<T>>) {
        // special case
    } else {
        // regular case
    }
}

在另一个选项(C ++ 17之前的版本)中标记插入标记,该选项具有允许成员初始化程序列表的优点:

template <typename T> struct tag{}; 

template <typename T, class S, size_t C>
class myClass
{
private:
    myClass(tag<std::vector<T>>) : myData(/*special case */) {/* special case */}

    template <typename U>
    myClass(tag<U>) : myData(/*regular case */) {/* regular case */}

public:
    myClass() : myClass(tag<S>{}) {}

private:
    S myData;
};
相关问题