Подтвердить что ты не робот

Шаблон функции с оператором

В С++ у вас есть шаблонный оператор в классе? Например:

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*

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

4b9b3361

Ответ 1

Вам нужно указать T.

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

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

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

Ответ 2

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

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

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>() вместо использования оператора.

Ответ 3

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

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

Foo foo;

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

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