2
4

2 に答える 2

3

オーバーロードされた関数テンプレートの単純なペアを使用できます。

template<typename T>
T& access(T& t) { return t; }

template<typename T>
T& access(T* t) { return *t; }

そして、次のように使用します。

access(val).member = 42;

例えば:

template<typename T>
struct A
{
    void do_it(T& val)
    {
        access(val).member = 42;
    }
};

struct Type
{
    int member = 0;
};

#include <iostream>

int main()
{
    A<Type> a;
    Type t;
    a.do_it(t);
    std::cout << t.member << std::endl;

    A<Type*> a2;
    Type* t2 = new Type(); // OK, I don't like this, but just to show
                           // it does what you want it to do...
    a2.do_it(t2);
    std::cout << t2->member;

    delete t2;             // ...but then, don't forget to clean up!
}

これが実際のです。

于 2013-03-20T16:48:58.843 に答える
2

おそらく最良のアイデアは、クラスをポインター型に特化することです。

template<class T>
class A{ ...}; 

template<>
class A<T*> { //implement for pointers
};

これが冗長すぎると感じた場合は、get_ref関数をオーバーロードできます。

template<class T> T& get_ref(T & r) {return r;}
template<class T> T& get_ref(T* r) {return *r;}

template<class T>
class A {
   void do(T val) {
     get_ref(val).member ...
  }
}
于 2013-03-20T16:54:06.343 に答える