Я ищу общий способ вызова std :: function с аргументами из QVariantList. Эта версия работает, но имеет недостаток: необходимо указать параметры шаблона:
template <typename... T>
struct VariantFunc {
static void Invoke(std::function<void(T...)> f, const QVariantList& args)
{
InvokeHelper(f, args);
}
private:
template <typename T1>
static void InvokeHelper(std::function<void(T1)> f, const QVariantList& args)
{
f(args.at(0).value<T1>());
}
template <typename T1, typename T2>
static void InvokeHelper(std::function<void(T1, T2)> f, const QVariantList& args)
{
f(args.at(0).value<T1>(), args.at(1).value<T2>());
}
template <typename T1, typename T2, typename T3>
static void InvokeHelper(std::function<void(T1, T2, T3)> f, const QVariantList& args)
{
f(args.at(0).value<T1>(), args.at(1).value<T2>(), args.at(2).value<T3>());
}
};
auto args = QVariantList() << 100 << QString("hello") << QJsonValue(1234);
auto f = [](int i, QString s, QJsonValue j) { qDebug() << i << s << j; };
VariantFunc<int, QString, QJsonValue>::Invoke(f, args);
Я бы хотел иметь такую реализацию:
struct VariantFunc2 {
template<typename Func>
static void Invoke(Func f, const QVariantList& args)
{
// ???
}
};
auto args = QVariantList() << 100 << QString("hello") << QJsonValue(1234);
auto f = [](int i, QString s, QJsonValue j) { qDebug() << i << s << j; };
VariantFunc2::Invoke(f, args);
Есть ли способ сделать это в C ++ 11?
Очевидно, что руководство по выводу для std :: function обеспечивает решение, но не с C ++ 11.