10

C++ 中是否有严格类型定义的习惯用法,可能使用模板?

就像是:

template <class base_type, int N> struct new_type{
    base_type p;
    explicit new_type(base_type i = base_type()) : p(i) {}
};

typedef new_type<int, __LINE__> x_coordinate;
typedef new_type<int, __LINE__> y_coordinate;

所以我可以使这样的事情成为编译时错误:

x_coordinate x(5);
y_coordinate y(6);

x = y; // whoops

__LINE__那里看起来可能很麻烦,但我不希望仅仅为了保持每种类型的唯一性而手动创建一组常量。

4

3 回答 3

7

我在我的项目中使用了类似的东西。只有我使用类型标记而不是 int。在我的特定应用程序中运行良好。

template <class base_type, class tag> class new_type{     
  public:   
    explicit new_type(base_type i = base_type()) : p(i) {}

    //
    // All sorts of constructors and overloaded operators
    // to make it behave like built-in type
    //

  private:
     base_type p;
};

typedef new_type<int, class TAG_x_coordinate> x_coordinate;
typedef new_type<int, class TAG_y_coordinate> y_coordinate;

注意 TAG_* 类不需要在任何地方定义,它们只是标签

x_coordinate x (1);
y_coordinate y (2);

x = y; // error
于 2013-02-21T16:42:45.623 回答
2

没有。有人提议将其纳入下一个标准(C++14,或者可能是 C++17),但在 C++11 中没有。

于 2013-02-21T15:24:20.447 回答
0

使用 C++11:

#include <stdio.h>

struct dummy {};

struct NotMineType
{
    NotMineType(dummy) {}
};

template <int N>
struct type_scope
{
    struct MyOwnType
    {
    };

    struct ConvertedToMineType : NotMineType
    {
        template <typename ...Args>
        ConvertedToMineType(Args... args) : NotMineType(args...) {};
    };

    enum myint : int {};
};

typedef type_scope<0>::MyOwnType x1;
typedef type_scope<1>::MyOwnType x2;

typedef type_scope<0>::ConvertedToMineType y1;
typedef type_scope<1>::ConvertedToMineType y2;

typedef type_scope<0>::myint i1;
typedef type_scope<1>::myint i2;

void foo(x1) { printf("x1\n"); }
void foo(x2) { printf("x2\n"); }
void foo(y1) { printf("y1\n"); }
void foo(y2) { printf("y2\n"); }
void foo(i1) { printf("i1\n"); }
void foo(i2) { printf("i2\n"); }

int main()
{
    foo(x1());
    foo(x2());
    foo(y1(dummy()));
    foo(y2(dummy()));
    foo(i1());
    foo(i2());
}

输出:

x1
x2
y1
y2
i1
i2

编译器:

视觉工作室 2015,GCC 4.8.x

于 2018-02-21T15:51:11.730 回答