gpt4 book ai didi

c++ - 什么时候引用函数有用?

转载 作者:太空狗 更新时间:2023-10-29 21:18:58 25 4
gpt4 key购买 nike

对数组参数的引用很有用,因为它可以防止衰减,让您可以推断出数组的大小。

template <typename T, std::size_t N>
constexpr std::size_t array_size(T (&) [N]) noexcept
{
return N;
}

但这什么时候有用呢?

template<typename T>
void foo(T& t)
{
// we now have a reference to bar
}

void bar() { }

int main()
{
foo(bar);
}

我们什么时候关心防止函数指针衰减?我问的是什么时候有用,而不是为什么不允许这样做。

最佳答案

与对象一样,如果“无对象”(“无功能”)是一个合理的值,我们会使用一个指针;如果我们希望确保(除非有人坚持搬起石头砸自己的脚)始终存在,我们会使用一个引用引用的有效对象(函数)。

考虑以下穷人的函数包装器(富人去 over there )。

template<typename>
class Function; // never defined

template<typename ReturnT, typename... ArgT>
class Function<ReturnT(ArgT...)>
{

private:

ReturnT (*func_)(ArgT...);

public:

// Will also accept a 'nullptr'
Function(ReturnT (*func)(ArgT...)) noexcept : func_ {func}
{
}

ReturnT
operator()(ArgT... args)
{
return this->func_(args...);
}
};

现在我们可以编写下面的程序了,它工作得很好。

#include <iostream>

int
add(int a, int b)
{
return a + b;
}

int
main()
{
Function<int(int, int)> f {add}; // ok
std::cout << f(5, 7) << std::endl; // ok, prints 12
}

但是,我们也可以写出下面的程序,但效果不是很好。

int
main()
{
Function<int(int, int)> f {nullptr}; // compiles fine
std::cout << f(5, 7) << std::endl; // compiles fine, crashes at run-time
}

相反,如果我们在模板定义中将 (*func) 替换为 (&func)

// Won't accept a 'nullptr'
Function(ReturnT (&func)(ArgT...)) noexcept : func_ {func}
{
}

线

Function<int(int, int)> f {nullptr};  // compile-time error

会触发编译时错误。

关于c++ - 什么时候引用函数有用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28709758/

25 4 0