【发布时间】:2013-08-15 11:07:36
【问题描述】:
我想创建封装原始数值类型的轻量级类型:
struct A { long value; }
struct B { long value; }
struct C { long value; }
...
这样我就可以对每种类型应用通常的算术运算,并获得预期的结果(并且与内置类型 long 相比没有任何运行时开销):
A a1 {10};
A a2 {20};
A a3 = a1 + a2:
++a3;
std::cout << a3; // prints "31"
...
但是,我不希望在不同类型之间进行任何(自动)转换,也不希望允许任何混合不同类型的算术运算。例如,以下代码应该不编译:
A a1 {10};
A a2 {20};
B b3 = a1 + a2: // error, cannot convert A to B
a2 += b3; // error, A::operator+=(B) does not exist
...
如果我只想要一个类型,那么所有这些都将很简单;只需为 A 类定义适当的操作。但是,如果我尝试对仅名称不同的 A、B、C 等类执行相同的操作,很快就会变得乏味。
我知道我可以使用预处理器宏来生成具有不同名称的多个副本。但是,我想知道是否有更优雅的方法不使用预处理器,并且不需要任何重复的代码。 (C++11 特定的解决方案很好。)
【问题讨论】:
-
如果您的意思是它们都具有相同的实现,但是是离散类型,您可以执行
template<typename T> struct Real {/*implement*/}; using A = Real<struct Dummy>; using B = Real<struct Dummy>;之类的操作。 -
根据您想要的这些类型的数量,您可能可以为您的类使用模板和
std::enable_if以及特殊的类型特征结构。 -
@chris:如果您每次都使用相同的
struct Dummy,您最终不会得到兼容的类吗? -
@MatthieuM.,我很确定它每次都会创建一个新的。 1秒。更新:是的,你是对的。它们是相同的,所以每个新的都需要一个不同的名称(cough
DummyA,DummyB)。 -
@MatthieuM.,啊,问题已经找到了。我想你会喜欢的:stackoverflow.com/questions/14232293/…