C++ 如何在compiletime检查两种类型是否相同(如果与Boost strong typedef配合使用,则会获得额外点数)

C++ 如何在compiletime检查两种类型是否相同(如果与Boost strong typedef配合使用,则会获得额外点数),c++,c++11,template-meta-programming,constexpr,static-assert,C++,C++11,Template Meta Programming,Constexpr,Static Assert,我想知道是否有可能在编译时检查这两种类型是否相同。 我想到的是(idk,如果它工作,因为它觉得黑客和idk标准很好,所以idk在测试时要寻找什么) #包括 增强型(双倍,厘米); 增强型(双倍,英寸); 模板 静态constexpr void\uuuu help() { } 模板 类是同一类型 { 公众: constexpr运算符bool() { return&&uu-help==&uu-help; }; }; 用法: int main() { static_assert(Ar

我想知道是否有可能在编译时检查这两种类型是否相同。 我想到的是(idk,如果它工作,因为它觉得黑客和idk标准很好,所以idk在测试时要寻找什么)

#包括
增强型(双倍,厘米);
增强型(双倍,英寸);
模板
静态constexpr void\uuuu help()
{
}
模板
类是同一类型
{
公众:
constexpr运算符bool()
{
return&&uu-help==&uu-help;
};
};
用法:

int main()
{
        static_assert(AreSameType<double,float>()== false, "oh noes1");
        static_assert(AreSameType<double,double>()== true, "oh noes2");
        static_assert(AreSameType<int*,double*>()== false, "oh noes3");
        static_assert(AreSameType<double*,double>()== false, "oh noes4");
        static_assert(AreSameType<const double,double>()== false, "oh noes5");
        static_assert(AreSameType<inch,cm>()== true, "oh expected"); //fires
}
intmain()
{
静态断言(arSameType()==false,“oh noes1”);
静态断言(arSameType()==true,“oh noes2”);
静态断言(arSameType()==false,“oh noes3”);
静态断言(arSameType()==false,“oh noes4”);
静态断言(arSameType()==false,“oh noes5”);
静态断言(arSameType()==true,“预期为oh”);//激发
}
所以

1) 有更好的方法吗?

2) 这是一个函数黑客的地址保证能按标准工作吗(我敢打赌不是:)?

使用
std::is_same
<如果T和U是同一类型,则代码>标准::is_same::值将为真,否则为假

如果您没有C++11,那么很容易实现如下所示

template<class T, class U>
struct is_same {
    enum { value = 0 };
};

template<class T>
struct is_same<T, T> {
    enum { value = 1 };
};
模板
结构是相同的{
枚举{value=0};
};
模板
结构是相同的{
枚举{值=1};
};

还有boost.TypeTraits中的
boost::is_same
。您希望它如何与
boost\u STRONG\u TYPEDEF
一起工作?就像std::is_same一样,刚刚测试过,它确实非常强大,我支持Xeo的评论,
BOOST\u STRONG\u TYPEDEF
的核心思想就是创建一个不会被意外地误解为其“来源”的类型。你想过为你的单位使用
Boost.Unit
吗?@MatthieuM-是的,这就是我想要的,可能源代码很混乱,抱歉,或者像使用
Boost::is_same
一样简单。很酷,我想尝试类似的东西,但我在弄清楚如何专门化(错误的词?)模板时遇到了麻烦。。。我试过愚蠢的模板和模板@nosensetal:specialize是正确的词。在这里,您可以看到部分专门化(即仍然存在模板参数),而
template
表示完全专门化(没有更多的模板参数:因此所有类型/值都是已知的)。
#include
还可以参考:注意,由于c++17,我们有一个更好的is_same_v,不再需要::value
template<class T, class U>
struct is_same {
    enum { value = 0 };
};

template<class T>
struct is_same<T, T> {
    enum { value = 1 };
};