关于C ++模板和运算符

时间:2010-10-21 17:15:54

标签: c++ templates operators

经过一些试验和很多错误后,我发现它对模板运算符并不是很有用。作为一个例子:

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 个答案:

答案 0 :(得分:2)

这不是模板的具体问题。这是一个语法问题。你正在做的事情是奇怪的,因为你只是改变了返回类型。如果您更改了操作员参数,则不必显式提供模板的类型。由于您确实需要提供类型,因此需要显式调用运算符来应用参数,因为这是唯一的方法。

查看grammar以获取完整的详细信息。

答案 1 :(得分:1)

返回类型不能用于重载分辨率。 operator []声明的签名的唯一区别在于它们的返回类型,所以只要你有两个,编译器就没有希望消除你的呼叫test["test without template will fail"];

答案 2 :(得分:0)

是的,模板参数推断不能简单地使用函数返回类型。但是,模板运算符重载非常有用,并且可以以一些非常大的方式应用。

下面是boost::phoenix的代码示例。

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

您可能会理解,这是打印出容器中所有奇数元素的简单方法。有点神奇。