强类型定义

Ver*_*tas 11 c++ templates type-deduction

有没有办法制作一个类型的完整副本,以便可以在模板推导上下文中区分它们?举个例子:

#include <iostream>

template <typename T>
struct test
{
    static int c()
    { 
        static int t = 0;
        return t++;
    }
};

typedef int handle;

int main()
{
    std::cout << test<int>::c() << std::endl;
    std::cout << test<handle>::c() << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

由于typedef只为类型创建别名,因此打印0,1而不是所需的0,0.是否有解决方法?

sha*_*ats 8

引用cplusplus.com,

请注意,无论是typedef还是使用create new distinct数据类型.它们只创建现有类型的同义词.这意味着上面使用WORD类型声明的myword类型也可以被认为是unsigned int类型; 它并不重要,因为两者实际上指的是同一类型.

由于int并且handle同一个,因此0 1预期输出.

然而,正如@interjay建议的那样,有一种解决方法.

你可以用BOOST_STRONG_TYPEDEF.

BOOST_STRONG_TYPEDEF( int , handle );
Run Code Online (Sandbox Code Playgroud)

  • 问题是找到一个不会有这种行为的`typedef`的替代品. (2认同)
  • 语言中没有内置,但这并不意味着无法构建(例如我上面发布的链接). (2认同)

Vla*_*tov 5

或者作为建议的 BOOST_STRONG_TYPEDEF

template<typename>
struct test {
    static int c() {
        static int t = 0;
        return t++ ;
    } 
};

//Instead of 
//typedef int handle

BOOST_STRONG_TYPEDEF(int , handle) ;  

int main() {

    std::cout << test<int>::c() << std::endl
    std::cout << test<handle>::c() << std::endl ;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:0 0,因为 handle不是int 而是一种可隐式转换为 int 的类型。

如果您不想使用 BOOST_STRONG_TYPE 则只需将第二个参数添加到您的类模板:

template<typename, unsigned int N>
struct test {
    static int c() {
        static int t = 0;
        return t++ ;
    }

};
Run Code Online (Sandbox Code Playgroud)

因此制作test<int, 0>test<handle, 1>不同类型

int main() {

    std::cout << test<int, 0>::c() << std::endl ;
    std::cout << test<handle,1>::c() << std::endl ;
    return 0;
} 
Run Code Online (Sandbox Code Playgroud)

输出:0 0

您还可以添加宏来生成您的类型:

#define DEFINE_TEST_TYPE(type) \
typedef test<type, __COUNTER__> test_##type;


template<typename, unsigned int N>
struct test {    
     static int c() {
        static int t = 0;
        return t++ ;   
    }
};

typedef int handle ;

DEFINE_TEST_TYPE(int) ;
DEFINE_TEST_TYPE(handle) ;

int main() {
    std::cout << test_int::c() << std::endl ;
    std::cout << test_handle::c() << std::endl ;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)