是否可能做到以下这样的事情,而不需要进行模板特化,从而编译通过?
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();
是否可能做到以下这样的事情,而不需要进行模板特化,从而编译通过?
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();
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
}
如果类很大并且有许多需要无论 T
是什么都需要的函数,则来自另一个答案的解决方案可能不可行。但是,您可以通过继承仅用于这些特殊方法的另一个类来解决此问题。然后,您只能专门化该基类。
在C ++ 14中,有方便的类型别名,因此语法可以变为:
std::enable_if_t<std::is_same<U, int>::value>
而C++17更短:
std::enable_if_t<std::is_same_v<U, int>>
std::enable_if_t
,而在C++17中,甚至可以使用std::is_same_v
来消除typename ... ::type
和::value
的冗长性。请保持原文意思不变,但要让翻译更加易懂通俗。 - TemplateRextemplate <class T>
class A;
template <>
class A<int>
{
void had_int(){}
};
template <>
class A<char>
{
void had_char(){}
};
A<char> b
,对吗? - qdii