2010-10-21 90 views
0

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

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; 
} 

因此,为了使与模板的操作是很丑陋的(除非您是入啰嗦了,真的是谁?)这就是为什么我一直在使用功能“”代替运营商。我的问题是为什么丑陋?为什么需要包含操作员关键字。我的猜测是,它与转换运算符的一些后端魔术不使用括号来进行参数有关,是否有解决方法?提前致谢。

+4

试验和错误,哦,你可以保存的时间,你读过一本书... – JoshD 2010-10-21 17:20:18

+0

请注意,如果运算符采用模板参数类型的参数(如模板 int&operator [](const T&key )然后编译器可以从你传递的参数中推导出模板参数 – 2010-10-21 17:21:56

+0

我的问题是WTF?你为什么要尝试这样做?专业化是应该避免的(如果可以的话)和模板化操作符应该只用于编译器可以通过模板参数推导规则计算出模板参数,对于C++模板相关书籍,我可以推荐“C++模板 - 完整指南” – sellibitze 2010-10-21 17:23:56

回答

2

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

查看grammar了解完整的详细信息。

+0

这。区分'<>'模板参数与比较运算符的语法很粗糙。 – 2010-10-21 17:28:25

+0

我只能想象这是一种虐待行为。 – JoshD 2010-10-21 17:31:25

+0

你是对的,这只是一个练习, ,我确实去寻找一些答案,然后把 代码键盘。该项目是一个像 系统目录;给定一个字符串路径和数据, 在内存中创建路径并存储数据。我的 方法是让一个类持有两棵树, 一个用于给定级别的数据,另一个用于 目录比当前目录更深。 一个简单的递归练习。我可以很容易地有 函数“getData”和“getDir”,但是因为这个 是一个练习,我觉得试图让 更精细些。 哦。 :? – 2010-10-21 18:32:31

1

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

0

是的,模板参数演绎不起作用函数返回类型很简单。但是模板运算符重载是非常有用的,并且可以以一些完全巨大的方式应用。

下面有一个代码示例从boost::phoenix

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

正如你可能知道这是一个打印容器中所有奇怪元素的简单方法。有点神奇。