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);
}
これは以前と同じように出力されます。これはあまり良い設計ではないことに注意してください。テンプレート引数に応じていくつかのコンストラクターを持つことは奇妙です。ただし、このコードは問題を解決します。