Zer*_*ool 10 c++ template-meta-programming
是否可以执行以下编译而无需模板专业化的操作?
template <class T>
class A {
public:
#if std::is_same<T,int>
void has_int() {}
#elif std::is_same<T,char>
void has_char() {}
#endif
};
A<int> a; a.has_int();
A<char> b; b.has_char();
Run Code Online (Sandbox Code Playgroud)
jro*_*rok 19
是.制作功能模板,然后使用std::enable_if以下条件启用它们:
#include <type_traits>
template <class T>
class A {
public:
template<typename U = T>
typename std::enable_if<std::is_same<U,int>::value>::type
has_int() {}
template<typename U = T>
typename std::enable_if<std::is_same<U,char>::value>::type
has_char() {}
};
int main()
{
A<int> a;
a.has_int(); // OK
// a.has_char(); // error
}
Run Code Online (Sandbox Code Playgroud)
如果类很大并且具有许多不需要的函数,那么来自另一个答案的解决方案可能是不可行的T.但是你可以通过继承另一个只用于这些特殊方法的类来解决这个问题.然后,您只能专门化该基类.
在C++ 14中,有方便的类型别名,因此语法可以变为:
std::enable_if_t<std::is_same<U, int>::value>
Run Code Online (Sandbox Code Playgroud)
和C++ 17,甚至更短:
std::enable_if_t<std::is_same_v<U, int>>
Run Code Online (Sandbox Code Playgroud)
是的,模板专业化:
template <class T>
class A;
template <>
class A<int>
{
void had_int(){}
};
template <>
class A<char>
{
void had_char(){}
};
Run Code Online (Sandbox Code Playgroud)