繁体   English   中英

模板函数采用任何函子并返回函子返回的类型

[英]Template function taking any functor and returning the type of the functor return

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

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>()))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM