-5

ここにコードがあります

#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ため、呼び出したくありません。foofoo<C&>(c2)

4

3 に答える 3

2

できません。式として、は、と同じようc2に型の左辺値であるため、どちらの場合も、引数に依存するルックアップはを選択します。Cc1foo<C>

Boost.TypeTraitsを使用しても同じ結果が得られます。

C ++ 11には役立つ新しい魔法があるかもしれませんが、(a)C ++ 11について答えるのに十分な知識がなく、(b)とにかく質問C++03にタグを付けました。

于 2011-12-14T12:43:42.107 に答える
0

編集された質問の場合:

foo<C&>(c2)関数がどの型でインスタンス化されているかわからないため、foo を呼び出したくありません

ありえませ。オブジェクトまたは参照が関数に渡されると、関数はそれがオブジェクトか参照かを認識しないためです。

提案された C++11 ソリューションの 1 つを次に示します (マクロを使用)。

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

FOOの代わりに使用foo

于 2011-12-14T10:31:02.453 に答える
-1

そうあるべきだと思う

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

それよりもOne test(C*)

于 2011-12-14T10:28:51.457 に答える