Могу ли я передать аргумент шаблона, не являющийся типом, перегруженному оператору?

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

#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 ++ то, что я пытаюсь сделать, или я должен просто отказаться и придерживаться именованного метода для получателя?

5
задан Lightness Races with Monica 2 February 2012 в 16:26
поделиться