Шаблон функции с оператором - PullRequest
31 голосов
/ 12 июля 2009

В C ++ можете ли вы использовать шаблонный оператор для класса? Вот так:

class MyClass {
public:
    template<class T>
    T operator()() { /* return some T */ };
}

Это на самом деле, кажется, компилируется просто отлично, но возникает путаница в том, как его использовать:

MyClass c;
int i = c<int>(); // This doesn't work
int i = (int)c(); // Neither does this*

Тот факт, что он вообще компилируется, подсказывает мне, что это выполнимо, я просто не знаю, как его использовать! Любые предложения, или этот метод использования не стартер?

Ответы [ 3 ]

44 голосов
/ 12 июля 2009

Вам необходимо указать T.

int i = c.operator()<int>();

К сожалению, в этом случае вы не можете использовать синтаксис вызова функции напрямую.

Редактировать: Да, и вам не хватает public: в начале определения класса.

18 голосов
/ 12 июля 2009

Ты в принципе прав. Допустимо определять шаблонные операторы, но их нельзя вызывать напрямую с явными аргументами шаблона.

Если у вас есть этот оператор:

template <typename T>
T operator()();

как в вашем примере, его можно назвать только так:

int i = c.operator()<int>();

Конечно, если аргумент шаблона может быть выведен из аргументов, вы все равно можете назвать его обычным способом:

template <typename T>
T operator()(T value);

c(42); // would call operator()<int>

Альтернативой может быть сделать аргумент ссылкой и сохранить выходные данные вместо его возврата:

template <typename T>
void operator()(T& value);

Так что вместо этого:

int r = c.operator()<int>();

вы могли бы сделать

int r;
c(r);

Или, возможно, вам следует просто определить простую get<T>() функцию вместо использования оператора.

4 голосов
/ 13 июля 2009

Разве вы не думаете о

class Foo {
    public:
    template<typename T>
    operator T() const { return T(42); }
};

Foo foo;

int i = (int) foo; // less evil: static_cast<int>(foo);

живой пример . Это доказывает, что вам не нужно указывать аргумент шаблона, несмотря на утверждение в принятом ответе.

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