在c++中创建新类型
Creating new types in C++
在c++中使用typedef为类型创建别名。
:
typedef double Length;
typedef double Mass;
创建两个可以混合使用的别名。也就是说,可以将Mass类型的值传递给需要Length类型值的函数。
是否存在创建新类型的轻量级方法?我希望它们在下面是双的,但要"不同",这样一个就不能代替另一个。
比起创建一个新的类或结构,我更喜欢更轻松的东西。此外,我还知道boost中的维度库。
BOOST_STRONG_TYPEDEF
似乎正是为您所寻找的而设计的。我相信它通过创建一个类并重载操作符使其表现得像内置类型来实现它的魔力,但我没有看过它的实现。
虽然BOOstrongTRONG_TYPEDEF是一个相当简单的解决方案,但如果你将长度和质量混合成更复杂的单位(例如在物理科学中),那么你可能需要使用Boost.Units.
c++ 11中另一个可能的答案是使用enum class: type。这将允许你做你想做的事,但它也有它自己的缺点。例如,您必须重载许多操作符。
#include <iostream>
#include <string>
enum class A : int;
enum class B : int;
std::ostream& operator<<(std::ostream& os, const A& t){
os << static_cast<int>(t);
return os;
}
std::ostream& operator<<(std::ostream& os, const B& t){
os << static_cast<int>(t);
return os;
}
int test(A t){
std::cout << "A " << t << std::endl;
return 0;
}
int test(B t){
std::cout << "B " << t << std::endl;
return 0;
}
int main(){
A a{static_cast<A>(42)};
B b{static_cast<B>(0)};
test(a);
test(b);
}
输出如下:
A 42
B 0
或者你可以直接得到这样的整数部分
template<class T>
int GetInt(T t)
{
return static_cast<int>(t);
}
std::cout << "B " << GetInt(t) << std::endl;
如果元类提案(p7070)获得通过(现在仍处于修订0阶段),那么我们将能够使用空元类创建强类型。提出了语法:
$class strong_typedef { };
using Length = $double.as(strong_typedef);
using Mass = $double.as(strong_typedef);
最早可能是c++ 20
相关文章:
- 有没有办法通过插入新类型名称而不是 int 来使用 2 位大小类型而不是 int?
- 在 C++17 中的每个实例化时生成一个新类型
- 使用 basic_string 声明新类型的字符串
- Visual C 新类型初始化
- C 通过Typedef定义新类型
- C 模板:返回新类型的正确方法
- 我如何将现有模板类部分分为新类型
- 每当C++调用函数时生成新类型
- 是否可以使用元编程将类型列表转换为对列表中每种类型具有特定隐式转换行为的新类型?
- 应替换现有类型,向其添加新类型
- C++,指向作为新类型的函数的指针
- 定义一个新类型并重载其运算符
- 在python中动态创建一个新类型
- 如何从模板类中的类型名传递创建新类型名
- 在函数返回值中定义一个新类型
- 如何在 MPI 中创建新类型
- 为什么要将变量类型 p 声明为新类型,而不是将其声明为类型 p
- C++使用类来定义新类型
- 用C++中的typedef来总结和定义一个具有两个函数的新类型
- 将新类型作为参数发送