那么,你可以等待C++ 17。
template<auto F>
struct function_ptr;
template<class R, class...Args, R(*F)(Args...)>
struct function_ptr<F> {
using signature = R(Args...);
constexpr R operator()(Args...args)const {
return F(std::forward<Args>(args)...);
}
constexpr operator signature*() const { return F; }
constexpr signature* operator+() const { return F; }
};
现在:
constexpr auto f_ = []()->int { return 4; };
function_ptr<+f_> f;
生成函数指针等f
。
template<class T>struct tag_t {};
template<class F, class...Fs, class R, class...Args>
constexpr auto chain_functions(tag_t<R(Args...)>) {
constexpr r = [](Args...args)->R{
return F{}(Fs{}..., std::forward<Args>(args)...);
};
return function_ptr<+r>{};
}
让我们链接函数指针。
constexpr auto f_ = []()->int { return 4; };
function_ptr<+f_> f0;
constexpr auto g_ = [](int(*f)())->int { return f(); });
function_ptr<+g_> g_raw;
auto g0 = chain_functions< function_ptr<+g_>, function_ptr<+f_> >(tag_t<int()>{});
now g
是function_ptr
。
int(*g)() = g0;
应该有希望编译和工作。 (未经测试,我无法访问足够的C++ 17编译器)。
还有一点钝,绝对没有测试过。基本上function_ptr
旨在创建一个类型,它携带一个编译时函数指针。 C++ 17为我们提供了constexpr
lambda表达式,包括在constexpr
上下文中获取函数指针的能力。
然后我们可以编写这些函数指针类型来生成一个新的函数指针类型。
如果这是在命名空间范围,你可以忽略捕获列表中的'f'。 –