我有一个简单的类 A
,提供一个可变参数函数模板。此函数使用来自 A
内部的私有数据,但函数本身是公开的。该类如下:
class A {
public:
A() :
_bla("bla: ") {
}
template <class T>
void bar(const T& value) {
std::cout << _bla << value << std::endl;
}
template <class H, class... T>
void bar(const H& value, const T&... data) {
std::cout << _bla << value << std::endl;
bar(data...);
}
private:
const std::string _bla;
};
在一个名为foo.hpp的单独文件中,我有一个函数
foo()
,它应该能够接收并使用函数a.bar()
作为参数:int main(int argc, char *argv[]) {
A a;
a.bar(1, "two", 3, 4);
foo(&a.bar);
}
我不太确定从哪里开始,但我尝试了以下操作-但没有成功。请问如何正确完成此操作:
template <typename... T>
inline void foo(void (bar *)(const T&...)) {
unsigned int x(0), y(0), z(0);
bar(x, y, z);
}
奖励问题:是否有一种方法可以不仅调用:
foo(&a.bar);
还可以使用以下形式调用foo
函数,将a.bar
绑定到某些参数上:
foo(&(a.bar(p1, p2));
我可以简单地将 p1
和 p2
添加到 foo
定义中,如下所示:
foo(p1, p2, &a.bar);
但如果我能在之前添加这些参数,从语义上讲,对我的目的更好一些。
enable_if
这种麻烦的东西呢?你可以直接重载它,写成void bar() {}
。 - jrokenable_if
来判断参数包是否为空。只需有一个模板重载为(H,T...)
,以及一个没有参数的重载,什么都不做即可。 - Mike Seymourfoo
接受一个函数,但a.bar
不是一个函数。它是一个模板。模板没有地址。有a.bar<int>
、a.bar<double, char>
等函数;你想传递哪一个给foo
?此外,你如何区分a.bar(p1, p2)
作为绑定到某些参数的函数和a.bar(p1, p2)
作为应用于所有参数的完全应用函数? - n. m.