템플릿 클래스 C<T>
A
및 B
으로 으로 인스턴스화하려는 템플릿 클래스가 있습니다. C<T>
은 foo
의 메소드를 가지며, 그 서명은 T
이 A
또는 B
으로 인스턴스화되었는지 여부에 따라 달라지기를 원합니다. 예를 들어, 다음 코드를 고려하십시오.SFINAE 및 매개 변수의 수
#include <iostream>
#include <string>
class A {
public:
void message() {
std::cout << "message with no args" << std::endl;
}
};
class B {
public:
void message(int x) {
std::cout << "message with " << x << std::endl;
}
};
template<typename T>
class C {
private:
T internal;
public:
C(T& x) {
internal = x;
}
void call() {
internal.message();
}
void call(int x) {
internal.message(x);
}
};
int main(int argc, char* argv[]) {
A a;
B b;
C<A> ca(a);
C<B> cb(b);
ca.call();
cb.call(42);
// ca.call(42); ERROR HERE
return 0;
}
이것은 올바르게 실행됩니다. ca.call(42)
은 A::message(int)
메서드가 없으므로 컴파일 오류가 발생합니다. 그러나 어떤 이유로 든 A
에 A::message(int)
이라는 메서드를 도입하면 코드에서 ca.call(42)
을 호출하는 것을 허용 할 수 있습니다.
SFINAE 기술을 사용하면 을 선언 할 수 있습니다. 여기에서 T::call_type
은 각각 의도 된 구체화 T
에 대한 typedef가됩니다. 그러나이 경우에만 인수의 형식을 C::call
변경할 수 있습니다. 대신 (특히 매개 변수의 수) 의 T
에 서명하고 싶습니다. 따라서 ca.call(42)
이 에 A::message(int)
이라는 방법이 있어도 유효한 호출이되는 것을 방지합니다.
이렇게 할 방법이 있습니까?