成员函数的C ++条件模板类定义

时间:2019-11-27 08:29:08

标签: c++ c++17

在头文件中给出以下类正向声明:

template <typename T, std::enable_if_t<std::is_integral_v<T>, int> = 0>
class context
{
public:
    context();
// ....
private:
// ....
    T data;
}

如何在cpp文件中定义构造函数(或任何其他成员函数)?尝试了所有我能想到的东西,但是没有匹配的东西。

另一个问题引起了我的注意Why can templates only be implemented in the header file?,我已经在项目的多个地方成功使用了公认的答案中建议的方法,但是在任何方法中我都找不到一种表示第二个模板参数的方法方式...该问题没有提供足够的信息来执行此操作。问题是这里的第二个模板参数使该参数与那里建议的方式不兼容,或者我只是找不到合适的语法来表示它,如果我的类只有第一个参数,它将回答它...

P.S。抱歉,如果重复的话,我真的试图找到一个类似的问题,只是找不到合适的术语来找到匹配项。

1 个答案:

答案 0 :(得分:5)

要提供类外定义,模板参数列表必须匹配。

template<typename T, std::enable_if_t<std::is_integral_v<T>, int> N>
context<T, N>::context() {
}

类模板定义中的参数类型为std::enable_if_t<std::is_integral_v<T>, int>。这正是超出类定义的参数的类型。

顺便说一句,我认为支票目前没有任何好处。与函数模板不同,函数模板可能会影响重载解析,而类模板则根本无法从机制中受益。 IMO最好将简单的静态断言添加到类模板声明中

template<typename T>
class context {
    static_assert(std::is_integral_v<T>, "Must be initialized with an integral type");
    // ...
};

然后,类外成员声明变得更加直接。而且有关错误模板参数的错误消息更容易阅读。