你可以做这样的事情,使用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);
}
仍然输出和以前一样。请注意,这不是一个好设计。根据你的模板参数有一些构造函数很奇怪。这段代码解决了你的问题。
我不认为这是可能的,只有两种方法我可以看到它完成是你不想做它的两种方法。 –
你总是可以使用静态工厂方法或帮助类,或者作为最后的手段,'X实例(* ptr);' –
Rook
有没有办法将静态工厂用作隐式转换? – gexicide