您可以使用SFINAE执行以下操作:
#include <iostream>
#include <type_traits>
template<class T> class X{
public:
X(int i) {
init();
}
private:
template<class U = T>
typename std::enable_if<std::is_pointer<U>::value>::type init() {
std::cout << "It's a pointer!\n";
}
template<class U = T>
typename std::enable_if<!std::is_pointer<U>::value>::type init() {
std::cout << "It's not a pointer!\n";
}
};
int main() {
X<int> a(1);
X<int*> b(2);
}
哪个输出:
It's not a pointer!
It's a pointer!
你没有重载构造函数,但你正在实现你想要的。
请注意,您需要 C++11 才能使用此代码。
编辑:好的,这段代码正是你想要的:
#include <iostream>
#include <type_traits>
template<class T> class X{
public:
template<class U = T, class enabler = typename std::enable_if<std::is_pointer<U>::value, T>::type>
X(int i) {
std::cout << "It's a pointer!\n";
}
template<class U = T, class enabler = typename std::enable_if<!std::is_pointer<U>::value, T*>::type>
X() {
std::cout << "It's not a pointer!\n";
}
};
int main() {
X<int> a;
X<int*> b(2);
}
仍然输出与以前相同。请注意,这不是一个很好的设计。根据您的模板参数有一些构造函数很奇怪。这段代码虽然解决了你的问题。