我有一个定义为如下的类模板
template<typename T>
class A
{
T t_;
// void f();
};
我的问题是,仅当类型T为整数而没有编译错误时,才添加f()方法。
int main()
{
A<int> a; // OK
A<string> b; // OK
}
谢谢。
您可以使用部分专业化,如下所示
template<typename T>
class A
{
T t_;
// void f()
};
template<>
class A<int>
{
int t_;
void f(){}
};
您可以使用type_traits
和SFINAE启用特定功能:
#include <iostream>
#include <string>
#include <type_traits>
template<typename T>
class A
{
public:
template<typename U = T, std::enable_if_t<std::is_integral_v<U>, int> = 0>
void f() {
std::cout << "int " << t_ << '\n';
}
private:
T t_;
};
int main() {
A<int> a;
a.f();
A<std::string> s;
// s.f(); // error: no member named 'f' in 'A<std::__cxx11::basic_string<char> >'
}
如果您有许多整数特定的函数,则可以将它们放在自己的类中,并且仅当T
是整数时才继承该类。
#include <iostream>
#include <string>
#include <type_traits>
template<typename Atype>
class int_functions {
public:
Atype* This() { return static_cast<Atype*>(this); }
void f() {
std::cout << "int " << This()->t_ << '\n';
}
};
template<typename Atype>
class non_int_functions {
};
template<typename T>
class A : public std::conditional_t<std::is_integral_v<T>, int_functions<A<T>>,
non_int_functions<A<T>>>
{
friend std::conditional_t<std::is_integral_v<T>, int_functions<A<T>>,
non_int_functions<A<T>>>;
public:
private:
T t_;
};