注意:我在函数的模糊重载中添加了类似但大大简化的问题版本,例如`msg(long)`与候选`msg(int32_t)`和`msg(int64_t)`.该版本具有在单个文件中完整可编译示例的优点.
我有一个C库,其功能类似于
obj_from_int32(int32_t& i);
obj_from_int64(int64_t& i);
obj_from_uint32(uint32_t& i);
obj_from_uint64(uint64_t& i);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,类型int32_t等都是不所述std的-它们是实现定义的,在这种情况下字符数组(在下面的例子中我省略转换-它不会改变的问题是有关映射可积类型到基于积分类型中位数的特定函数).
我有第二个C++接口类,它有类似的构造函数
MyClass(int z);
MyClass(long z);
MyClass(long long z);
MyClass(unsigned int z);
MyClass(unsigned long z);
MyClass(unsigned long long z);
Run Code Online (Sandbox Code Playgroud)
注意,我不能用std::int32_t样式类型替换这个接口- 如果我可以,我不需要问这个问题;)
问题是如何obj_from_根据积分类型中的位数调用正确的函数.
我提出了两个建议的解决方案,因为没有任何杀手级解决方案浮动到列表的顶部,并且有一些解决方案已被打破.
由干杯和赫斯提供.-阿尔夫.从这一点开始的评论是我自己的 - 随意评论和/或编辑.
优点
- 相当简单(至少相比boost::enable_if) - 不依赖于第三方库(只要编译器支持tr1)
*缺点** - 如果需要更多功能(如anotherObj_from_int32等),则需要更多代码
这个解决方案可以在下面找到 - 看看,它很漂亮!
好处
一旦ConvertFromIntegral功能完成后,添加需要转换为有价值的新功能-只需编写一组重载的int32_t, …
c++ ×1