繁体   English   中英

如何从 variadric class 模板构建没有任何输入值的参数包?

[英]How to build a parameter pack without any input values, from variadric class template?

我有一个 class,它将产生一组值并将它们传递给回调,如可变参数模板 arguments 所定义:

template <typename... TResults>
class Statement
{
public:

  using HandleValues = std::function<bool(TResults...)>;

  void getValues(const HandleValues& hander);
}

我的真实代码是模板化的 SQL 语句处理程序,因此这些是要从数据库中读取的类型。 为了简化,想象一下这些虚拟方法产生的值:

// Some overloads exist that produce a value:
template <typename TRead>
struct Produce
{
  static TRead value() {}
};

template <>
struct Produce<int>
{
  static int value() { return 42; }
};

template <>
struct Produce<bool>
{
  static bool value() { return true; }
};

在实际代码中,这些是转换特征。

有问题的代码试图将生成的值放入回调中。 我试过这个:

template <typename... TResults>
void Statement<TResults...>::getValues(const RowHandler& handler)
{
  return handler((Produce<TResults>::value(), ...));
}

我得到的错误:

 MSVC: error C2064: term does not evaluate to a function taking 1 arguments

GCC 更详细:

./include/sqlite3++/Statement.h:84:3:   required from 'void sqlitepp::Statement<TResults>::execute(const RowHandler&, TValRest ...) [with TValRest = {const char*}; TResults = {double, int}; sqlitepp::Statement<TResults>::RowHandler = std::function<bool(double, int)>]'
../build/examples/basic/BasicSQLite/BasicSQLite.cpp:52:5:   required from here
../include/sqlite3++/Statement.h:94:19: error: no match for call to '(const RowHandler {aka const std::function<bool(double, int)>}) (int)'
   94 |     return handler((ReadTraits<TResults>::ReadFromStatement(reader), ...));
      |            ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from c:\mingw\lib\gcc\mingw32\9.2.0\include\c++\functional:59,
                 from ../include/sqlite3++/internal/RawStatement.h:14,
                 from ../include/sqlite3++/Statement.h:5,
                 from ../build/examples/basic/BasicSQLite/BasicSQLite.cpp:6:
c:\mingw\lib\gcc\mingw32\9.2.0\include\c++\bits\std_function.h:685:5: note: candidate: '_Res std::function<_Res(_ArgTypes ...)>::operator()(_ArgTypes ...) const [with _Res = bool; _ArgTypes = {double, int}]'
  685 |     function<_Res(_ArgTypes...)>::
      |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~

显然,arguments 实际上并没有扩展。 我尝试了其他变体,例如还在模板参数之后放置... ,但没有任何帮助。

使用此返回处理程序(Produce::value()...);

暂无
暂无

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

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