C++ 在C++;,是否可以通过使用Others的模板向重载运算符提供参数?
例如,我可以有如下语句:C++ 在C++;,是否可以通过使用Others的模板向重载运算符提供参数?,c++,C++,例如,我可以有如下语句: A = B *<5> C; A=B*C; 其中5是参数(可提供上下文),*是重载运算符,运算符*使用给定参数 例如,下面列出了一个非工作且不太有意义的代码(只是为了说明这一点) (当然,如果我们定义一个新函数mul i.o.重载现有的*运算符,这是可能的。) struct myClass{ int-val=0; myClass(int x){ val=x; } 模板myClass运算符*(myClass x){ 返回val*x.val+s; }; };
A = B *<5> C;
A=B*C;
其中5是参数(可提供上下文),*是重载运算符,运算符*使用给定参数
例如,下面列出了一个非工作且不太有意义的代码(只是为了说明这一点)
(当然,如果我们定义一个新函数mul i.o.重载现有的*运算符,这是可能的。)
struct myClass{
int-val=0;
myClass(int x){
val=x;
}
模板myClass运算符*(myClass x){
返回val*x.val+s;
};
};
int main()
{
我的a级(10)、b级(3);
myClass c=a*b;
}
==编辑====
为了更好地解释这个问题,我想补充一些动机:
元编程通常提供了一种扩展语言的方法。
当编译器看到一个表达式C=a*B时,它当然知道a和B,但它也知道结果的去向,在本例中是C,并且可以根据这些知识来提供更好的代码
当重载一个操作符时,我们只有A,B-提供一些关于结果的信息,例如,在某些情况下,C的类型可以提供更好的优化,对于我的原始情况,可以避免完全错误的结果
之所以需要类似*的参数,是因为该参数可以设置为可选参数,仅在需要时使用,而在不需要时使用-这是正常的*
使用:c=a.运算符*b;正如下面建议的那样,它可以工作并解决问题 为了能够指定模板参数,您需要切换到成员函数调用语法。那会变成
myClass c = a *<5> b;
myClass c=a*b;
进入
myClass c=a.operator*(b);
是的,您可以,但您需要这样做:
myClass c = a.operator*<5>(b);
myClass c=a.operator*(b);
或
myClass c=a.模板运算符*(b);
我可以想出一种解决方法,允许您保持正常的运算符语法,同时仍然在一个额外的参数中使用隧道:
- 用自己的
运算符*
A = wrapper<5>(B) * C;
A=wrapper(B)*C;
其中wrapper
类似于std::reference\u wrapper
,带有运算符*
返回。。。无论B*C
是什么
这看起来太笨重了,真的觉得不值得。我想如果你愿意,它可以从Nathan的答案中转发给模板成员
操作符*
。XY问题。使用命名函数。重载运算符的要点是使用现有运算符的语法。这将违反这一点。您应该只使用一个普通的模板方法。如果您的关注是基于返回类型,您可以考虑返回一个代理,该代理基于它的<代码>代理::操作符T-())/代码>或“代码> B。*(*)*c/代码>如果您想要在其中出现5的拼写。
myClass c = a.operator*<5>(b);
myClass c = a.template operator*<5>(b);
A = wrapper<5>(B) * C;