在C ++中创建新类型

时间:2011-08-22 01:39:32

标签: c++ typedef

在C ++中使用typedef可为类型创建别名。

所以:

typedef double Length;
typedef double Mass;

创建两个可以混合的别名。换句话说,我们可以将Mass类型的值传递给期望值类型为Length的函数。

是否有创建新类型的轻量级方法?我希望它们在下面是双重的但是“不同”,这样就不能用它来代替另一个。

我更喜欢比创建新类或结构更轻松的东西。另外,我知道boost中的lib维度。这比我需要的更复杂,并且做得更多。

4 个答案:

答案 0 :(得分:19)

BOOST_STRONG_TYPEDEF似乎完全符合您的要求。我相信它通过创建一个类并重载运算符使其行为类似于内置类型来实现它的魔力,但我没有看过它的实现。

答案 1 :(得分:11)

虽然BOOST_STRONG_TYPEDEF是一个非常简单的解决方案,但如果你将长度和质量混合到更复杂的单元中(例如在物理科学中),那么你可能想要使用Boost.Units

答案 2 :(得分:1)

如果Metaclasses提案(p7070)通过(现在它仍在revision0),那么我们将能够使用空元类创建强类型定义。建议的语法:

$class strong_typedef { };
using Length = $double.as(strong_typedef);
using Mass = $double.as(strong_typedef);

最早我们可能会看到这将是C ++ 20

答案 3 :(得分:1)

在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;