免責事項: 以下を実装するためのより良い方法が多数あることは知っていますが、テンプレートとメンバーへのポインターについてさらに学習する方法としてこれを行っています。私はそれらをいじっていますが、次のことが可能かどうかを確認したいと思います。
非静的メンバー関数として機能する非メンバーテンプレート関数が必要です。さまざまなクラスがそれを独自に実装し、関数が影響するデータ メンバーを設定できます。
template <typename T, typename Y, Y T::* P>
void add10ToMember() {
*P += static_cast<Y>(10);
}
struct DoubleHolder
{
double value{ 0.0 };
void(&add10)(void) =
add10ToMember<DoubleHolder, double, &DoubleHolder::value>;
};
struct IntHolder
{
int value{ 0 };
void(&add10)(void) =
add10ToMember<IntHolder, int, &IntHolder::value>;
};
add10ToMember
この例では、指定されたメンバーに 10 を加算する単純な関数であるテンプレート関数を作成しました。
DoubleHolder
orのオブジェクトをインスタンス化するとすぐにIntHolder
、コンパイルが失敗し、次のようなエラーが表示されます。 'int IntHolder::* '".
エラーが発生する理由を理解しています:add10ToMember
実際にはどちらを認識していないかDoubleHolder
、IntHolder
操作を実行する必要があります。add10ToMember<IntHolder, int, &IntHolder::value>
実際のメンバー関数にはなりません。IntHolder
それはまだ、指定されていないインスタンスに影響を与える単なるグローバル関数です。
しかし、これではないにしても、私が望むものを書く正しい方法が何であるかがわかりません。それは可能ですか?