【发布时间】:2015-12-03 07:02:55
【问题描述】:
我有一个成员函数,它从串口接收一些数据和同一个类中的几个解析器函数,然后将接收到的数据解析为特定格式。所有解析函数都采用相同的参数。我想要的是将任何类型的解析器函数传递给接收函数,以使接收函数返回与解析器返回相同的类型。 我尝试过的:
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)'
【问题讨论】:
-
如果你的编译器支持C++14,你可以完全省略
decltype(...)返回类型,让编译器推断返回类型。 -
@Jens 请注意,它不再支持 SFINAE(但在这种情况下可能不是问题)
-
@PiotrSkotnicki 是的,但我认为 OP 在这里不需要任何 SFINAE,他只想要一个返回与解析器函数相同类型的函数,无论它是什么。
标签: c++ c++11 templates stdbind