gpt4 book ai didi

c++ - 模板函数采用任何仿函数并返回仿函数返回的类型

转载 作者:行者123 更新时间:2023-11-30 05:34:51 25 4
gpt4 key购买 nike

我有一个成员函数,它从串行端口和同一个类中的几个解析器函数接收一些数据,然后将接收到的数据解析为特定格式。所有解析函数都采用相同的参数。我想要的是将任何类型的解析器函数传递给接收函数,并使接收函数返回与解析器返回的类型相同的类型。我试过什么:

class Foo
{
public:
template<typename F>
auto receive(F parser) -> decltype(parser(std::declval(QByteArray)))
{
QByteArray response = readAll();
return parser(response);
}

QHash<QString, QVariant> parseHash(QByteArray data);
QString parseString(QByteArray data);
void doStuff();
};

void Foo::doStuff()
{
QHash<QString, QVariant> response = receive(&Foo::parseHash); // Compilation error

// Another try..
response = receive(std::bind(&Foo::parseHash, this, std::placeholders::_1)); // Also compilation error
}

在这两种情况下编译都失败并显示消息

error: C2893: Failed to specialize function template 'unknown-type Foo::receive(F)'

使用以下模板参数:'F=QHash (__thiscall Foo::LocalConnector::* )(QByteArray)'

最佳答案

在下面的片段中:

QHash<QString, QVariant> response = receive(&Foo::parseHash);

parseHash 是一个非静态成员函数,因此它需要一个隐式对象参数。否则,表达式 SFINAE 失败,使 receive 成为不可行的候选对象。

以下应该可以代替:

void Foo::doStuff()
{
auto callback = std::bind(&Foo::parseHash, this, std::placeholders::_1);

QHash<QString, QVariant> response = receive(callback);
}

或者简单地使 parseHash 成为静态成员函数。

还有,你的表达SFINAE有错字,应该是:

decltype(parser(std::declval<QByteArray>()))

关于c++ - 模板函数采用任何仿函数并返回仿函数返回的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34059729/

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