constexpr函数指针vs转发函数

时间:2014-12-01 07:05:42

标签: c++11 function-pointers static-methods static-members constexpr

我需要一个模板类,它将家庭非重载的非模板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 ...

问题是,什么更好?

  1. 静态constexpr函数指针(更简洁,可能(?)有间接调用惩罚)或
  2. 静态内联完美转发功能(更详细,但直接调用,必要时可以使用重载)。
  3. 一种方法优于另一种方法吗?

    也许另一种方式提出问题,constexpr函数指针通过运行时指针产生间接调用?

0 个答案:

没有答案