经过一些试验和很多错误后,我发现它对模板运算符并不是很有用。作为一个例子:
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”来代替运算符。我的问题是为什么丑陋?为什么需要包含操作员关键字。我的猜测是它与变换运算符的一些后端魔法有关,不使用括号来获取参数,有什么方法可以解决这个问题吗?在此先感谢。
答案 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 << ' '
]
);
您可能会理解,这是打印出容器中所有奇数元素的简单方法。有点神奇。