次の作業コードがあります。
class person
{
private:
int age_;
public:
person() : age_(56) {}
void age(int a) { age_ = i; }
}
template < class T, void (T::* ...FUNC)(int) > class holder;
template < class T, void (T::*FUNC)(int)>
class holder<T, FUNC>
{
public:
typedef typename T::value_type value_type;
public:
explicit holder() : setter(FUNC) { std::cout << "func\n"; }
private:
std::function<void (value_type&, int)> setter;
};
template < class T>
class holder<T>
{
public:
explicit holder() { std::cout << "plain\n"; }
};
int main()
{
holder<person> h1;
holder<person, &person::age> h2;
// this does not work:
holder<int> h3;
}
int (またはその他の非クラス、構造体、または共用体型) の場合、2 番目のテンプレート引数のメンバー関数が予期されるため、コードが機能しないことを私は知っています。
私の質問は、コードを変更して機能させる方法です。ホルダークラスを簡単に使用できるようにするために、そのように機能する必要があります。
型の特徴で試してみましたが、メンバー関数ポインターをクラスのコンストラクターに移動しました。成功せずに。
助言がありますか?前もって感謝します!