在我的最后一个问题中,我在获得模板专业化工作方面获得了很大帮助。现在我需要一点扩展。我想要这些陈述的两个专业:
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; }
};
特别的是,这两个成员函数有不同的参数类型。所以我不能对两者使用相同的可变参数模板成员函数。我尝试了两个不同的可变参数模板。但这不起作用。成员函数的默认值也不起作用。
有人对我有好的提示吗?
这是具有一个成员函数的解决方案(感谢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:不,我不会在两天内提出“三个、四个、五个成员函数必须做什么”?;-)