переадресация интерфейса из переменной-члена с использованием шаблонов C ++ - PullRequest
0 голосов
/ 22 июня 2010

Как мне сказать:

template<typename T>
class X {
  // if T has method x(), define
  //   Y x() { return t.x() }

  T t;
};

1 Ответ

3 голосов
/ 22 июня 2010

Просто определите это.

Если 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() не сможет быть реализована. Это все еще не идеальная пересылка, так как вам нужно знать список аргументов априори, но теперь вы можете иметь дело с вариацией возвращаемого типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...