在c++中创建新类型

Creating new types in C++

本文关键字:类型 新类型 c++ 创建      更新时间:2023-10-16

在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