gpt4 book ai didi

c++ - 当函数的参数是函数指针时,函数对象如何用作函数指针

转载 作者:行者123 更新时间:2023-11-30 02:49:23 25 4
gpt4 key购买 nike

我有一个与 C++ 中的函数对象或仿函数相关的问题。我理解函数对象在很多情况下可以替代函数指针,比如STL中的一些算法。但是,如果函数的参数是函数指针,我不知道如何调用函数对象。例如:

          class ClassA
{
public:
void operator()(std::string &name)
{
std::cout<<"Class A"<<std::endl;
}
};

class ClassB
{
public:
void operator()(std::string &name)
{
std::cout<<"Class B"<<std::endl;
}
};

void testClass(void(*fun)(std::string&), std::string &name )
{
(*fun)(name);
}

void funClass(std::string &str)
{
std::cout<<"hello C "<<str<<std::endl;

}

如果我只使用函数指针,调用testClass函数是非常容易的:

std::string str= "hello.txt";


testClass(funClass,str);

但是,如果我想使用函数对象,我不知道如何调用 testClass。

   ClassA obj;
testClass(obj.operator()(str),str); // compilation errors

最佳答案

“仿函数”类不是函数指针。然而,std::function 采用的构造函数将从仿函数或函数指针隐式创建一个。

如果你被允许修改 testClass 那么最好让它更通用:

void testClass( std::function< void( std::string & ) > func, std::string & name )
{
func( name );
}

然后你可以调用

testClass( ClassA(), name );

如果它不打算修改字符串,它可能应该通过 const 引用获取此参数。

您可以为您的类编写委托(delegate)函数,像这样转发它们,但我认为这不是您真正想要的,因为您必须为每个委托(delegate)编写一个:

否则你可以像这样写一个模板函数

template< typename T >
void callT( std::string & name )
{
T t;
t( name );
}


testClass( callT< ClassA > );

如果您使用的是 C++11,您可以在您的实例中传递一个 lambda 函数,该函数将转换为一个函数指针。 (感谢 Steve Jessop 告诉我这个)。

在这种情况下,这是一种变通方法,因为您必须为要使用它的每个仿函数类键入 lambda 函数。 (因此,即使有该功能,模板也可能更好)。

用你会做的 lambda 来做

testClass( []( std::string & str ){ ClassA a; a(str); }, name );

请注意,对于能够转换为函数的 lambda,它不能采用验证码,但是如果您需要额外的数据成员,则无法执行模板化版本。

关于c++ - 当函数的参数是函数指针时,函数对象如何用作函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21255592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com