質問する
85 次
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 に答える