我想创建封装原始数字类型的轻量级类型:
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"
...
但是,我不想在不同类型之间进行任何(自动)转换,并且我不想允许任何混合不同类型的算术运算。例如,下面的代码应该not编译:
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 特定解决方案很好。)
一种方法是模板化类,它充当实际类型的该类的唯一实现和类型别名。这可能如下所示:
namespace detail {
template<typename Alias>
struct Implementation {
//do everything once
};
}
using A = detail::Implementation<struct DummyA>;
using B = detail::Implementation<struct DummyB>;
using C = detail::Implementation<struct DummyC>;
只要每个使用不同的类型作为模板参数,每个都将是具有相同实现的唯一类型,并且真正的类可以隐藏在用户不应该接触的东西中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)