dec*_*iar 7 c++ templates variadic-functions
#include <iostream>
void padd(int a, int b) { std::cout << a + b << std::endl; }
void psub(int a, int b) { std::cout << a - b << std::endl; }
template <??? op>
class Foo {
public:
template<typename... Arguments>
void execute(Arguments... args) {
op(args ...);
}
};
int main() {
auto f1 = Foo<padd>();
f1.execute(5, 6); // ideally would print 11
auto f2 = Foo<psub>();
f2.execute(5, 6); // ideally would print -1
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我试图弄清楚如何在C++中将函数(以及,如果可能的话,模板函数)绑定为模板参数.
目前我不知道这是否可能.
这里的一个踢球者是功能签名不能保证是相似的.
编辑:感谢@sehe和@Potatoswatter,我现在的解决方案是:http://ideone.com/0jcbUi .会在适当的时候写下答案.
我建议让编译器在适当的时候担心解析函数签名.http://ideone.com/ZeLt1E(代码包括在下面).
如果你需要调整重载集或多态接口,我建议你也看一下BOOST_PHOENIX_ADAPT_FUNCTION.
编辑响应注释:这是一个演示如何直接使用函数指针和/或指针到成员函数作为函数参数.这是另一种极端方法:http://ideone.com/120Ezs
#include <iostream>
template <typename F>
struct Foo {
Foo(F&& f) : f(std::forward<F>(f)) {}
template<typename... Arguments>
void execute(Arguments... args) {
f(args ...);
}
private:
F f;
};
template <typename F>
Foo<F> make_foo(F&& f = F()) { return {f}; }
void padd(int a, int b) { std::cout << a + b << std::endl; }
void psub(int a, int b) { std::cout << a - b << std::endl; }
int main() {
auto f = make_foo(padd);
f.execute(5, 6);
make_foo(psub).execute(5, 6);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
感谢 Potatoswatter 和 sehe 在 C++ Lounge 和这里的帮助,我已经制定了我的问题的解决方案。
#include <iostream>
#include <functional>
template <typename func_t, func_t func>
struct Foo {
template <typename... Arguments>
void execute(Arguments... args) {
func(args ...);
}
};
template <typename T, typename func_t, func_t func>
struct FooMember {
T member;
FooMember(T member) : member(member) {}
template <typename... Arguments>
void execute(Arguments... args) {
std::function<void(T&, Arguments ...)> f(func);
f(this->member, args ...);
}
};
struct Bar {
int z;
Bar(int z) : z(z) {}
void add(int x, int y) { std::cout << x + y + z << std::endl; }
};
void padd(int x, int y, int z) { std::cout << x + y + z << std::endl; }
int main() {
auto a = Foo<decltype(&padd), &padd>();
auto b = FooMember<Bar, decltype(&Bar::add), &Bar::add>(Bar(2));
a.execute(4, 5, 6); // prints 4+5+6 : 15
b.execute(4, 5); // prints 4+5+a.z : 4+5+2 : 11
return 0;
}
Run Code Online (Sandbox Code Playgroud)