首页 > 解决方案 > 相同基础类型的 C++ 变体

问题描述

我有一个使用几个 typedef 的 std::variant 的代码库。最初,这些是不同的类型,但现在它们重叠,如下例所示

typedef int TA;
typedef int TB;
std::variant<TA, TB> a(TA(1));

有没有一种零开销的方法来完成这项工作?在 Scala 中,我会为此目的使用不透明类型,类似的东西是如何实现 C++ 的?

标签: c++types

解决方案


您可以将类型包装在一个类中:

struct TA {
    int value;
};

struct TB {
    int value;
};

std::variant<TA, TB> a(TA{1});

现在您有两种不同的类型,每种类型都包含一个没有开销的整数,并且可以在一个变体中加以区分。


有一些技巧可以使一个类表现得像一个整数,以最小化程序中所需的更改。例如,您可以为基础类型定义一个隐式转换运算符。然而,这些技巧也可能违反直觉,因此请谨慎使用。


推荐阅读