Могу ли я передать нетипичный аргумент шаблона перегруженному оператору? - PullRequest
5 голосов
/ 02 февраля 2012

Я хотел бы добавить синтаксический сахар в класс, перегрузив () как метод получения.Однако метод getter принимает нетипизированный аргумент шаблона.Рассмотрим простой тестовый пример:

#include <iostream>

class Foo
{
public:
  template <int i> void get()
  {
    std::cout << "called get() with " << i << std::endl;
  }
  template <int i> void operator()()
  {
    std::cout << "called overloaded () with " << i << std::endl;
  }
};

int main()
{
  Foo foo;
  foo.get<1>();
  foo.get<2>();
  foo<3>(); // error: no match for ‘operator<’ in ‘foo < 3’
  return 0;
}

Компилируется и запускается, как ожидается, если закомментировано foo<3>();.Поддерживает ли синтаксис C ++ то, что я пытаюсь сделать, или я должен просто сдаться и придерживаться именованного метода для получателя?

Ответы [ 2 ]

8 голосов
/ 02 февраля 2012

Синтаксис, который вы ищете, существует, но он вам не понравится:

foo.operator()<3>();

Итак, придерживайтесь названной функции.

0 голосов
/ 02 февраля 2012

Вы можете сделать это, поместив шаблон в класс следующим образом:

template<int i>
class Foo
{
    Foo()
    {
        std::cout << "called overloaded () with " << i << std::endl;
    }

    static void Get()
    {
        std::cout << "called get() with " << i << std::endl;
    }
};

int main()
{
    Foo<1>::Get();
    Foo<3>();
    return 0;
}

Однако есть небольшая потеря, так как вы создадите объект Foo при вызове формы direct ().

Кроме того, я полагаю, что в вашем реальном коде есть много других вещей в классе Foo, поэтому, вероятно, будет недопустимо перемещать шаблон в класс (что может быть значительным изменением дизайна) просто для управления этим.

РЕДАКТИРОВАТЬ:

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

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