前回の質問で、テンプレートの専門化を機能させる上で大きな助けになりました。今、私は少し拡張が必要です。これらのステートメントには 2 つの特殊化が必要です。
int main()
{
// First specialization
holder_ext<person> h1;
holder_ext<person, &person::age> h2;
holder_ext<int> h3;
// Second specialization
holder_ext<person, &person::age, &person::name> h4;
}
私のクラスの人は次のようになります。
class person
{
private:
std::string name_;
int age_;
public:
person(const std::string &name)
: name_(name), age_(56)
{}
void age(int a) { age_ = i; }
void name(const std::string &n) { name_ = n; }
};
特別なことは、2 つのメンバー関数のパラメーターの型が異なることです。したがって、両方に同じ可変個引数テンプレート メンバー関数を使用することはできません。2 つの異なる可変個引数テンプレートで試しました。しかし、それはうまくいきません。また、メンバー関数のデフォルト値は機能しません。
誰かが私に良いヒントを持っていますか?
これは、1 つのメンバー関数を使用したソリューションです ( Pubbyのおかげです)。
template < class T, void (std::conditional<std::is_class<T>::value, T, struct dummy>::type::* ...FUNC)(int)> class holder;
template < class T, void (T::*FUNC)(int)>
class holder<T, FUNC>
{
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"; }
};
よろしくお願いします!
PS: いいえ、「3 つ、4 つ、5 つのメンバー関数をどうする必要があるか」については、2 日以内に思いつきませんか? ;-)