Просто определите это.
Если X::x
не вызывается, то T::x
также не должно существовать. Если вызывается X::x
и T::x
не существует, сообщение об ошибке будет указывать на использование X::x
. Большинство компиляторов используют формулировку в следующем виде: «Неизвестный идентификатор x
при компиляции Y X<Something>::x(void)
в этом контексте: независимо от того, что называется X :: x () для чего-то, что его не поддерживает ».
РЕДАКТИРОВАТЬ: Поскольку вы используете C ++ 0x, обязательно используйте decltype:
template<typename T>
class Forwards {
T t;
public:
decltype(this->t.x()) x() { return this->t.x(); }
};
Я не уверен на 100%, стоит ли использовать decltype(T::x())
, decltype(t.x())
или decltype(this->t.x())
, но я почти уверен, что это должно сработать. Если t
не предоставляет x
, то функция Forwards::x()
не сможет быть реализована. Это все еще не идеальная пересылка, так как вам нужно знать список аргументов априори, но теперь вы можете иметь дело с вариацией возвращаемого типа.