C++ 使用const tuple ref作为参数调用std::get时没有匹配的函数

C++ 使用const tuple ref作为参数调用std::get时没有匹配的函数,c++,c++11,stdtuple,C++,C++11,Stdtuple,为了在SQL中构建查询,我一直在尝试创建一个通用函数。 为了做到这一点,我使用了tuple和variadic模板,以便使查询更加通用。 这是代码(这不是最终代码,所以请理解部分代码是伪代码): #包括 模板 结构访问\u Tup\u Impl { 模板 静态常量std::string和visit_tup(常量std::tuple和value,int comp) { 如果(I==comp) { //我知道它没有任何作用——为了简单起见 std::get(值); 返回空字符串; } 其他的 { 回访

为了在SQL中构建查询,我一直在尝试创建一个通用函数。 为了做到这一点,我使用了tuple和variadic模板,以便使查询更加通用。 这是代码(这不是最终代码,所以请理解部分代码是伪代码):

#包括
模板
结构访问\u Tup\u Impl
{
模板
静态常量std::string和visit_tup(常量std::tuple和value,int comp)
{
如果(I==comp)
{
//我知道它没有任何作用——为了简单起见
std::get(值);
返回空字符串;
}
其他的
{
回访计划实施::回访计划(值,comp);
}
}
};
模板
模板
常量std::字符串&
Visit_Tup_Impl::Visit_Tup(常量std::tuple&value,int comp)
{
断言(0&“不应发生”);
返回空字符串;
}
模板
字符串
创建耦合查询(const std::vector&keys、,
常量标准::向量和值)
{
std::ostringstream本地;

本地由于您没有发布,我们无法判断错误发生的位置。
std::get
没有将
tuple
作为模板参数;它使用
Types…
。无论如何,您不需要详细说明参数(当然,超出索引):只需将其设置为
std::get(值)
。也就是说,您的代码中该调用的目的不清楚-它没有任何副作用,您可以忽略其返回值,因此也可以在不更改代码含义的情况下删除它。@IgorTandetnik关于您所说的what-dos std::get-get-as参数,您可以在此处检查:[链接]关于你所说的关于只使用std::get的第二件事,我以前做过,尽管它做了一个隐式递归模板实例化。关于代码的含义,正如我在文章中所说的,它目前是伪代码,以使它尽可能简单。@GuyTi你误解了这页所说的内容。模板参数是
,而不是元组。关于“隐式递归模板实例化”不管是什么,你可能想问一个关于这个的问题。将其显式化不太可能解决任何问题。由于你没有发布错误,我们无法判断错误发生的位置。
std::get
不将
tuple
作为模板参数;它需要
类型…
。无论如何,你不需要拼写参数(当然,索引之外):只需将其设置为
std::get(值)
。也就是说,您的代码中该调用的目的不清楚-它没有任何副作用,您可以忽略其返回值,因此也可以在不更改代码含义的情况下删除它。@IgorTandetnik关于您所说的what-dos std::get-get-as参数,您可以在此处检查:[链接]关于你所说的关于只使用std::get的第二件事,我以前做过,尽管它做了一个隐式递归模板实例化。关于代码的含义,正如我在文章中所说的,它目前是伪代码,以使它尽可能简单。@GuyTi你误解了这页所说的内容。模板参数是
关于“隐式递归模板实例化”,不管它是什么,你可能想问一个问题。把它显式化不太可能解决任何问题。
#include <tuple>

template<std::size_t I>
struct Visit_Tup_Impl
{
  template<typename ...T>
  static const std::string& visit_tup (const std::tuple<T...>& values, int comp)
  {
    if (I == comp)
    {
      // I know it doesn't do anything - for simplicity
      std::get<I, std::tuple<T...> > (values);
      return EMPTY_STRING;
    }
    else
    {
      return Visit_Tup_Impl<I-1>::visit_tup (values, comp);
    }
  }
};

template<>
template<>
const std::string&
Visit_Tup_Impl<0>::visit_tup (const std::tuple<>& values, int comp)
{
  assert (0 && "Should not happen");
  return EMPTY_STRING;
}

template <typename ...T>
std::string
create_coupled_query (const std::vector<std::string>& keys,
                      const std::vector<std::tuple<T...> >& values)
{
  std::ostringstream local;
  local << "(";

  auto iter = values.begin ();
  auto iter_end = values.end ();
  for (; iter != iter_end; ++iter)
  {
    local << "(";
    int i = 1;
    do
    {
      local << keys [i] << "=" << to_sql_string (Visit_Tup_Impl<(sizeof...(T) - 1)>::visit_tup (*iter, i));
      ++i;
      if (i < keys.size ())
        local << " AND ";
    }
    while (i < keys.size ());

    local << ")";
    if (iter + 1 != iter_end)
      local << " OR ";
  }

  local << ")";

  return local.str ();
}