例如,我可以有如下声明:
A = B *<5> C;
Run Code Online (Sandbox Code Playgroud)
其中5是一个参数(可以提供上下文),*是重载运算符,而operator *使用给定的参数。
例如,下面列出了A NON-WORKING且意义不大(仅表示重点)。
(这当然是可能的,如果我们定义了一个新的功能MUL io的重载现有的运算符*)。
struct myClass {
int val = 0;
myClass (int x) {
val = x;
}
template<int s> myClass operator* (myClass x) {
return val * x.val + s;
};
};
int main()
{
myClass a(10), b(3);
myClass c = a *<5> b;
}
Run Code Online (Sandbox Code Playgroud)
====编辑====
我想增加一些动机,希望能更好地解释这个问题:
通常,元编程提供了一种扩展语言的方式。当编译器看到表达式C = A * B时,它当然知道A和B,但是它也知道结果的去向,在这种情况下为C,并且可以根据此知识采取行动以提供更好的代码。
当运算符重载时,我们只有A,B-提供有关结果的一些信息,例如,在某些情况下C的类型可以提供更好的优化,而对于我的原始情况,可以避免完全错误的结果。
想要** 5之类的原因是该参数可以设置为可选参数,并且仅在需要时使用,而在不需要时才使用-这是正常的*。
使用:c = a.operator * b; 如以下建议工作并解决了问题。
为了能够指定模板参数,您需要切换到成员函数调用语法。那会变成
myClass c = a *<5> b;
Run Code Online (Sandbox Code Playgroud)
进入
myClass c = a.operator*<5>(b);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
101 次 |
| 最近记录: |