如何检查是否两种类型在编译时相同的(如果它与加速强的typedef工作的奖励积分)(How to c

2019-07-02 14:40发布

我想知道是否有可能检查2种类型是在编译时相同。 我想出了是(IDK的,如果它的工作原理,因为它感觉的hackish和IDK标准好,所以IDK要寻找什么测试时需要)。

#include <boost/strong_typedef.hpp>
BOOST_STRONG_TYPEDEF(double, cm);
BOOST_STRONG_TYPEDEF(double, inch);
template<typename T, typename U>
static constexpr void __help() 
{
}
template<typename T, typename U>
class AreSameType
{
    public:
    constexpr operator bool()
    {
     return &__help<T,U> == &__help<U,T>;
    };
};

用法:

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
}

所以

1)有没有给它一个更好的办法?
2)函数的破解这个地址保证通过标准的工作(我不会赌:))?

Answer 1:

使用std::is_samestd::is_same<T,U>::value如果T和U是相同的类型,否则返回假将为真。

如果你没有C ++ 11,很容易实现,因为这

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

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


文章来源: How to check if two types are same at compiletime(bonus points if it works with Boost strong typedef)