2

有没有办法做这样的伪代码(顺便说一句,我知道我不能使用模板来做到这一点,这只是为了说明):

template<operator Op>
int operator Op (int a, number b) {
    return (a Op to_int(b));
}

你的主旨是正确的。目前我使用了很多重载来做到这一点,但它太重复了。我尝试使用 void* 指针(用于函数 args)并最终传递运行时类型 ID 信息,但代码似乎过于复杂。任何其他解决方案....

谢谢你的想法

我正在尝试编写更少被覆盖的方法...我必须为 +,-,/,* 编写 12 ..更不用说我想覆盖的其余操作了。

让我给你更具体的例子,我想少重复:

scalar operator Op (scalar a, string b) {..Op..}
scalar operator Op (scalar a, number b) {..Op..}
scalar operator Op (scalar a, scalar b) {..Op..}

处理方式不同,但是当我必须在其中进行计算时,除了操作员不同外,它是相同的。所以我不会做 12 个重载方法,而是做 3 个。里面的代码可能比我的第一个插图要长,抱歉。

我想我找到了一个解决方案: http ://en.wikipedia.org/wiki/Barton-Nackman_trick 或者 boost libs nevsan 指出。

4

5 回答 5

4

我认为你可以用宏来帮助做到这一点:

#define DEFINE_NUMBER_OP(op) \
int operator op (int a, number b) { \
    return (a op to_int(b));\
}\
\
int operator op (number a, int b) { \
    return (to_int(a) op tb);\
}\
\
int operator op (number a, number b) { \
    return <generic code to do op on numbers>;\
}\
\

然后你使用它:DEFINE_NUMBER_OP(+);

但我会考虑重新考虑你的方法。不要自动让你的用户混合不同的类型,而是强制他们明确指出他们想要的数学。只支持number OP number运算符而不是隐式支持一堆 int 操作。

编辑:更详细一点,当您开始支持许多隐式运算符时,很容易犯错误并执行可能需要数小时或数天才能调试的不需要的操作,而不是一次编写代码并明确指示您的意图(记住你只需要写一次你的意图,人们每次阅读代码时都能清楚地看到你的意思,直到时间结束)。

于 2012-08-22T15:44:42.277 回答
1

这可能对您的情况有所帮助,也可能无济于事,但 checkout boost operator

于 2012-08-22T15:47:44.593 回答
1

这实际上可能是宏的任务:

#define DEFINE_OPERATOR_( op, res, lhs, rhs, ltr, rtr ) \
   res operator##op( lhs l, rhs r ) { return ltr op rtr; }
#define DEFINE_OPERATOR_L( op, res, lhs, rhs ) \
   DEFINE_OPERATOR_( op, res, lhs, rhs, to_int(lhs), rhs )
#define DEFINE_OPERATOR_R( op, res, lhs, rhs ) \
   DEFINE_OPERATOR_( op, res, lhs, rhs, lhs, to_int(rhs) )
#define DEFINE_OPERATOR_BOTH( op, mytype, othertype ) \
   DEFINE_OPERATOR_L( op, othertype, mytype, othertype ) \
   DEFINE_OPERATOR_R( op, othertype, othertype, mytype )

DEFINE_OPERATOR_BOTH( *, number, int );
DEFINE_OPERATOR_BOTH( /, number, int );
//...

#undef DEFINE_OPERATOR_BOTH
#undef DEFINE_OPERATOR_L
#undef DEFINE_OPERATOR_R
#undef DEFINE_OPERATOR_
于 2012-08-22T15:48:07.813 回答
1

最后,您定义了一个函数名。所以没有严格的语言方法来做到这一点。

不过,这可能可以通过使用预处理器来完成。

于 2012-08-22T15:24:05.103 回答
1

免责声明 - 我反对这一点:

struct A
{
    operator int() {return 0;}
};

当您尝试执行诸如1+a(where ais an A) 之类的操作时,演员表将是隐式的。

另外,您不再需要该to_int功能。

不要这样做

于 2012-08-22T15:28:51.740 回答