私は、静的関数を作成するアクセサテンプレートクラスの1つのコンポーネントであるC++のプロパティライクなシステムで作業しています。オーバーロードされたテンプレートクラス
template <typename T, typename V, V (T::*getf)(), void (T::*setf)(V)>
struct Accessor
{
static V Get(T* obj)
{
return (obj->*getf)();
}
static void Set(T* obj, V aValue)
{
return (obj->*setf)(aValue);
}
};
そして、私は上のアクセサを使用することがありますテストクラス:ここ
は、アクセサは次のようになります。 SetFooがintを取る方法に注意してください。SetBarはconst int &をとります。
class TargetClass
{
int foo;
int bar;
public:
TargetClass(int f, int b)
: foo(f)
, bar(b)
{
}
int GetFoo()
{
return foo;
}
void SetFoo(int f)
{
foo = f;
}
int GetBar()
{
return bar;
}
void SetBar(const int& b)
{
bar = b;
}
};
そして最後に、ここでの用法です:
int main()
{
TargetClass* target = new TargetClass(5, 3);
// Works great
typedef Accessor<TargetClass, int, &TargetClass::GetFoo, &TargetClass::SetFoo> fooAcessor;
fooAcessor::Set(target, 13);
int foo = fooAcessor::Get(target);
// Doesn't work, because TargetClass::SetBar takes a const int& as an argument, instead of an int
typedef Accessor<TargetClass, int, &TargetClass::GetBar, &TargetClass::SetBar> barAcessor;
delete target;
return 0;
}
私はそれが第四引数ですのでAcessor構造体を「オーバーロードする」試みたがconstのV &ですが、それが動作するようには思えません。私がここでやろうとしていることは可能ですか?
set関数に 'const int&'を一貫して使用しないのはなぜですか?それでは 'void SetFoo(int f)'と 'template'に変更します。 –
wally
私はアクセサーを可能な限り柔軟にしようとしています。実際には、プリミティブ型だけでなく、クラス/構造体、ポインタとともに使用されます。残念ながら、コードベース全体にすべてのセッターでconst参照を使用させるのは現実的ではありません。/ –