【发布时间】:2017-12-10 20:15:12
【问题描述】:
我有一个模板函数,我们称之为“客户端”:
template<typename T>
void client(T (*func)(const std::string&), const std::string& s) {}
然后有许多“adaptee”函数,它们都具有相同类型的第一个非默认参数,但以下参数的数量不同并且具有默认值:
void adaptee_one(const std::string&, int i = 1, char* c = nullptr) {}
void adaptee_two(const std::string&, float* f = nullptr) {}
上述功能是给定的。现在我要做的就是将它们作为第一个参数传递给上面的client<>() 函数,而我只关心传递第一个参数const std::string&。所以我做了以下事情:
void bindAdapteeOne(const std::string& s) {
return adaptee_one(s);
}
void bindAdapteeTwo(const std::string& s) {
return adaptee_two(s);
}
然后将bindAdapteeX() 传递给client<>()。
我想做的是自动化包装或使用一个(模板化的)包装器,而不是每个适配者一个。我觉得可变参数可能就是这种情况,但对如何准确应用它们知之甚少。
C++11 很好,如果绝对必要,C++14 也很好。
【问题讨论】:
-
是否允许使用 lambda?
-
@AndyG 它在命名空间中,在任何类之外,所以我认为是的,只要有一个理智的地方来保存它们。
-
@rici 因为doesn't work.
-
@Barry:确实正确。虽然它与
operator()一起工作得很好,但这仍然是一堆样板。 (但是对于灵活的模板而不是强制转换为函数指针,仍有一些话要说。)
标签: c++ c++11 templates c++14 default-arguments