如何将"using"用于函数?
How to use "using" for a function?
如何使用"using"作为函数?例如
class A;
void f(int);
struct B
{
using BA = A;
using Bf = f; ???
};
你可以做
struct B
{
using BA = A;
constexpr static auto Bf = f;
}
这样,您就不必担心指定类型,这可能会很烦人。
您不想声明非静态变量,否则对象的每个副本都将携带一个函数指针。您也不希望它是可变的,因为这样您就可以重新分配它。你也不希望在运行时确定它,因为这样编译器将不得不在给定的上下文中向自己证明对Bf
的调用实际上是在调用f
,否则支付函数间接成本。constexpr
处理最后两点。
如果f
只是一个函数,则可以添加一个成员函数指针:
void (*Bf)(int) = f;
或者只是将其包装在一个函数中:
void Bf(int i) { f(i); }
不过可能更喜欢后者,因为它避免了向B
添加额外的成员。
如果f
是函数模板,则不能只是别名,而是需要转发到它:
template <class... Args>
auto Bf(Args&&... args)
-> decltype(::f(std::forward<Args>(args)...))
noexcept(noexcept(::f(std::forward<Args>(args...))))
{
return ::f(std::forward<Args>(args)...);
}
这是...是的。
Nir Friedman的答案很好,但如果f
过载,它就不起作用了。
在 C++14 中,您可以使用通用 lambda 对此有一个解决方案:
struct B {
using BA = A;
static constexpr auto BF = [](auto&&... args) {
return f(std::forward<decltype(args)>(args)...);
};
};
如果这看起来有点复杂,那只是因为std::forward
的啰嗦。我将不std::forward
地展示它,以使其更易于掌握(但不使用它,因为如果f
引用类型作为参数,它会失败):
struct B {
using BA = A;
static constexpr auto BF = [](auto... args) { return f(args...); };
};
区别在于
A
只是一个类型,而f
是一个实际的函数。如果要使用 using
将Bf
定义为f
的类型,请使用:
using Bf = decltype(f);
相关文章:
- (此函数用于计算 SMA).在 FA.exe 中0x00509159引发异常: 0xC0000005:访问冲突读取位置0
- cv2有什么区别.StereoSGBM_create() 和 cv2.StereoBM_create() 函数用于 Op
- 模板 ctor 类型推导不起作用(没有匹配的构造函数用于初始化 ...)与函数<>参数
- Qt中是否有QLabel::setScaledContent等效函数用于QGraphicsScene?
- 递归函数用于计算 n 个数字之和的意外输出
- 替换(或重新实现?)std::函数用于某些统计和测试
- 如何将成员函数用于同一类的不同对象
- 为什么lambda函数用于stl函数,例如sort(),c 中的max_element()函数以两个参数为输入
- 如何在 Cython 中将C++中的模板化函数用于两种类型
- 编译库的C 挂钩函数用于调试
- 在已发布的结构中添加构造函数(用于 memcpy)是否安全?
- 没有匹配的构造函数用于初始化模板化类的构造函数
- C 无匹配函数用于呼叫错误(默认为参考通过)
- 没有匹配函数用于调用 std::transform,未解析的重载函数类型
- 函数用于随机数(C++11)
- 是否有一个函数用于遍历POSIX环境变量
- “没有匹配的构造函数用于初始化”与矢量
- 函数用于C样式字符串和C++std::string
- 有选择地内联函数(用于调试目的)
- 两个模板函数用于两种标准类型