Ste*_*hot 6 c++ templates sfinae type-traits c++17
所以基本上,我现在有一个非常基本的泛型类,目前正在测试type_traits头.我目前正在尝试使用某些类型的函数,即现在的算术类型.
#include <type_traits>
template <typename T> class Test {
public:
template <typename U = T>
typename std::enable_if<std::is_arithmetic<U>::value>::type print();
};
Run Code Online (Sandbox Code Playgroud)
该函数完美地工作,仅适用于算术类型.
但我喜欢保持我的课程整洁,只让他们有原型,而功能实现在课堂之外.
使用标准模板即
void test();
template <typename T> void Test<T>::test() {}
Run Code Online (Sandbox Code Playgroud)
它很简单,我知道如何,但我不知道如何用" std::enable_if" 声明类外的实现,并且我在编译过程中的每一次尝试都说原型与类中的任何一个都不匹配.
我设法在这里找到了一个类似的问题,但那里的课程是标准的而不是通用的.
PS.我使用MinGW-w64和-std = c ++ 17
您需要一组模板参数用于类模板,一组单独的模板参数用于成员函数模板.您需要重复整个复杂的返回类型,因为它是函数模板签名的一部分.请注意,您不能重复默认参数=T,否则编译器会认为您尝试定义它两次(不检查新定义是否相同).
template <typename T> template <typename U>
typename std::enable_if<std::is_arithmetic<U>::value>::type
Test<T>::print()
{
// Implementation here.
}
Run Code Online (Sandbox Code Playgroud)
顺便说一下,你正在使用编写类型的"漫长道路",正如C++ 11中所需要的那样.但是C++ 14引入了一条std::enable_if_t捷径,而C++ 17则引入了一条std::is_arithmetic_v捷径.因此,如果您使用的是C++ 17,您也可以编写类型
typename std::enable_if<std::is_arithmetic<U>::value>::type
Run Code Online (Sandbox Code Playgroud)
就像
std::enable_if_t<std::is_arithmetic_v<U>>
Run Code Online (Sandbox Code Playgroud)
如果将 放入enable_if默认模板参数中(无论如何,这更好),类外定义会变得更容易一些:
template<typename T>
struct Test
{
template <typename S = T
, typename = typename std::enable_if<std::is_arithmetic<S>::value>::type >
void print();
};
template<typename T>
template<typename S, typename>
void Test<T>::print()
{
//some code
}
Run Code Online (Sandbox Code Playgroud)