我需要一个模板类,它将家庭非重载的非模板c函数映射到C ++模板函数中,以使后续代码更通用:
例如,假设一个C库对于一堆类型具有这些功能:
c_fun_float(...)
c_gun_float(..)
c_fun_double(...)
c_gun_double(..)
我想把它称为
cpp<T>::fun(...)
cpp<T>::gun(..)
在C ++ 11中。
为此,我正在使用这种模式:
template<class T> cpp;
template<> cpp<double>{
"static fun maps to c_fun_double"; // pseudo code
"static gun maps to c_gun_double"; // pseudo code
};
template<> cpp<float>{
"static fun maps to c_fun_float"; // pseudo code
"static gun maps to c_gun_float"; // pseudo code
};
问题是如何编写此映射代码。第一次尝试是(可能滥用C ++ 11):
template<> cpp<double>{
static constexpr auto fun = &c_fun_double; // nice short code!
static constexpr auto gun = &c_gun_double;
};
... corresponding code for float ...
哪个看起来很干净。然而,我后来意识到这些是功能的指针而不是&#34;真正的&#34;函数(例如,不能内联?)。另一方面,它们是constexpr
所以可能实际上它可以直接调用(不太可能)。
所以我决定将代码更改为
template<> cpp<double>{
template<class... Args>
static inline auto fun(Args&&... args) -> decltype(c_fun_double(std::forward<Args>(args)...)){
return c_fun_double(std::forward<Args>(args)...);
} // lots of typing!
template<class... Args>
static inline auto gun(Args&&... args) -> decltype(c_gun_double(std::forward<Args>(args)...)){
return c_gun_double(std::forward<Args>(args)...);
}
// perhaps write a macro
};
... corresponding code for float ...
问题是,什么更好?有
一种方法优于另一种方法吗?
也许另一种方式提出问题,做constexpr
函数指针通过运行时指针产生间接调用?