compile-time function for checking type equality

北城余情 提交于 2019-11-30 13:46:01

问题


I need to implement self contained compile-time function for checking type equality (function template without arguments bool eqTypes<T,S>()).

self contained means not relying on library.

I'm not good in all this. That's what I tried, but it's not what I need.

template<typename T>
bool eq_types(T const&, T const&) { 
return true;
}

template<typename T, typename U> 
bool eq_types(T const&, U const&) { 
return false; 
}

回答1:


It's quite simple. Just define a type trait and a helper function:

template<typename T, typename U>
struct is_same
{
    static const bool value = false;
};

template<typename T>
struct is_same<T, T>
{
    static const bool value = true;
};

template<typename T, typename U>
bool eqTypes() { return is_same<T, U>::value; }

Here is a live example.

In C++11, if you are allowed to use std::false_type and std::true_type, you would rewrite the above this way:

#include <type_traits>

template<typename T, typename U>
struct is_same : std::false_type { };

template<typename T>
struct is_same<T, T> : std::true_type { };

template<typename T, typename U>
constexpr bool eqTypes() { return is_same<T, U>::value; }

Notice, that the type trait std::is_same, which does pretty much the same thing, is available as part of the Standard Library.




回答2:


Here's how you can do it in C, without any magic GCC extensions:

#define CHECKED_TYPE(original_type, p) ((conversion_type*) (1 ? p : (original_type*) 0))

E.g:

void *q = CHECKED_TYPE(int, &y);

Will trigger a compile error if y is not int.
For explanation, see here.



来源:https://stackoverflow.com/questions/16924168/compile-time-function-for-checking-type-equality

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!