당신은 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