在我的last question在使模板特化工作方面,我得到了很大的帮助。现在我需要一点扩展。我想要这些语句的两个特化:
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"; }
};
再次提前致谢!
P.S.:不,我不会在两天内提出“三、四、五个成员函数必须做什么”? ;-)
对于完全通用的解决方案,您会遇到一个无法解决的问题:无法推断非类型模板参数的类型,因此它必须在模板声明中明确显示,因此无法告诉模板您需要多个指向成员的指针参数,每个参数都具有未知类型。
我对 C++11 的使用还不够多,但您可以尝试强制对成员模板参数进行排序并在模板中提供所有签名:
template <typename T,
void (std::conditional<...>::type*)(int),
void (std::conditional<...>::type*)(const std::string&)>
同样,它可能有效也可能无效...
我是一名优秀的程序员,十分优秀!