那麼,你可以等待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'。 –