Заставить is_reference работать внутри шаблона функции для справки, не зная типа, для которого должна создаваться функция - PullRequest
0 голосов
/ 14 декабря 2011

Вот код

#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>::test<T>(0)) == 1 };
     enum {result = !val};

};

template < class T>
void foo(T t){
  std::cout<< IsReference<T>::result << "\n";
}

class C{
  public: int a;
};

int main(){
  C c1;
  C &c2 = c1;
  foo(c1);
  foo(c2);
}

Вывод 0 для foo(c2) также, который я не хочу.

Внутри foo как я могу проверить, является ли T ссылочным типом или нет?Я не хочу вызывать foo как foo<C&>(c2), т.е. мы не знаем, к какому типу относится функция.

Ответы [ 3 ]

2 голосов
/ 14 декабря 2011

Вы не можете. В качестве выражения c2 является lvalue типа C, точно так же, как c1, поэтому в обоих случаях поиск, зависящий от аргумента, выберет foo<C>.

Вы получаете тот же результат , используя Boost.TypeTraits.

Возможно, в C ++ 11 появятся новые волшебства, но (a) я недостаточно знаю о C ++ 11, чтобы ответить, и (b) вы все равно отметили вопрос C ++ 03 .

0 голосов
/ 14 декабря 2011

Для отредактированного вопроса :

Я не хочу называть foo foo<C&>(c2), т. Е. Мы не знаем, для какого типа создается экземпляр функции

Это невозможно .Потому что, когда объект или ссылка передаются функции, функция не знает, является ли она объектом или ссылкой.

Вот одно из предложенных решений C ++ 11 (с использованием макроса);

#define FOO(X) foo<decltype(X)>(X)

Используйте FOO вместо foo

0 голосов
/ 14 декабря 2011

Я думаю, это должно быть

template<typename C> static One test(C&);

, а не One test(C*)

...