О шаблоне C ++ и операторах - PullRequest
0 голосов
/ 21 октября 2010

После некоторых проб и множества ошибок я пришел к выводу, что это не очень полезно для операторов шаблонов. Как пример:

class TemplateClass
{
  //Generalized template
  template<TType>
  TType& operator[](const std::string& key)
  {
    return TType;
  }
  //Specialized template for int
  template<>
  int& operator[]<int>(const std::string& key)
  {
    return 5;
  }
  //Specialized template for char
  template<>
  char& operator[]<char>(const std::string& key)
  {
    return 'a';
  }
}
int main()
{
  TemplateClass test;
  //this will not match the generalized template.
  test["test without template will fail"]; 
  //this is not how you call an operator with template.
  test<char>["test with template will fail"];
  //this works!
  test.operator[]<int>["test will work like this"];
  return 0;
}

Так что создавать оператор с шаблоном довольно некрасиво (если вы не разбираетесь в подробностях, а кто на самом деле?) Вот почему я использовал функцию «get» вместо операторов. Мой вопрос, почему уродство? Почему необходимо включить ключевое слово оператора. Я предполагаю, что это связано с некоторой внутренней магией преобразования операторов, чтобы не использовать скобки для получения аргументов, и есть ли способ обойти это? Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 21 октября 2010

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

Проверьте грамматику для получения полной информации.

1 голос
/ 21 октября 2010

Типы возврата не могут использоваться для разрешения перегрузки.Единственное различие в сигнатурах ваших операторов operator [] заключается в их типах возвращаемых данных, поэтому, как только у вас было два из них, компилятор не надеялся устранить неоднозначность вашего вызова test["test without template will fail"];

0 голосов
/ 21 октября 2010

Да, вывод аргументов шаблона не работает с простыми типами возвращаемых функций.Однако перегрузка оператора шаблона действительно полезна и может применяться несколькими совершенно потрясающими способами.

Ниже приведен пример кода из boost :: phoenix .

for_each(c.begin(), c.end(),
    if_(arg1 % 2 == 1)
    [
        cout << arg1 << ' '
    ]
);

Как вы понимаете, это простой способ распечатать все нечетные элементы в контейнере.Какая магия.

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