Проверка, является ли аргумент шаблона ссылкой [C ++ 03] - PullRequest
6 голосов
/ 13 декабря 2011

Я хочу проверить, имеет ли аргумент шаблона ссылочный тип или нет в C ++ 03. (У нас уже есть is_reference в C ++ 11 и Boost).

Я использовал SFINAE и тот факт, что у нас не может быть указателя на ссылку.

Вот мое решение

#include <iostream>
template<typename T>
class IsReference {
  private:
    typedef char One;
    typedef struct { char a[2]; } Two;
    template<typename C> static One test(C*);
    template<typename C> static Two test(...);
  public:
    enum { val = sizeof(IsReference<T>::template test<T>(0)) == 1 };
    enum { result = !val };

};

int main()
{
   std::cout<< IsReference<int&>::result; // outputs 1
   std::cout<< IsReference<int>::result;  // outputs 0
}

Есть какие-то конкретные проблемы с этим? Кто-нибудь может предложить мне лучшее решение?

Ответы [ 2 ]

15 голосов
/ 13 декабря 2011

Вы можете сделать это намного проще:

template <typename T> struct IsRef {
  static bool const result = false;
};
template <typename T> struct IsRef<T&> {
  static bool const result = true;
};
7 голосов
/ 13 декабря 2011

лет назад я написал это:

//! compile-time boolean type
template< bool b >
struct bool_ {
    enum { result = b!=0 };
    typedef bool_ result_t;
};

template< typename T >
struct is_reference : bool_<false> {};

template< typename T >
struct is_reference<T&> : bool_<true> {};

Мне кажется, это проще, чем ваше решение.

Однако, он использовался всего несколько раз и мог что-то упустить.

...