相关疑难解决方法(0)

Pretty-print C++ STL containers

Please take note of the updates at the end of this post.

Update: I have created a public project on GitHub for this library!


I would like to have a single template that once and for all takes care of pretty-printing all STL containers via operator<<. In pseudo code, I'm looking for something like this:

template<container C, class T, String delim = ", ", String open = "[", String close = "]">
std::ostream & operator<<(std::ostream & o, const C<T> …
Run Code Online (Sandbox Code Playgroud)

c++ templates operator-overloading pretty-print c++11

379
推荐指数
5
解决办法
4万
查看次数

如何将元组扩展为可变参数模板函数的参数?

考虑具有可变参数模板参数的模板化函数的情况:

template<typename Tret, typename... T> Tret func(const T&... t);
Run Code Online (Sandbox Code Playgroud)

现在,我有一个t价值元组.如何func()使用元组值作为参数调用?我已经阅读了bind()函数对象,call()函数,以及apply()不同的一些现在过时的文档中的函数.GNU GCC 4.4实现似乎call()bind()类中有一个函数,但是关于这个主题的文档很少.

有些人建议使用手写的递归黑客,但可变参数模板参数的真正价值在于能够在上述情况下使用它们.

有没有人有解决方案,或提示在哪里阅读它?

c++ arguments tuples c++11

127
推荐指数
6
解决办法
4万
查看次数

如何在C++ 11中迭代std :: tuple

我做了以下元组:

我想知道如何迭代它?有tupl_size(),但阅读文档,我没有得到如何利用它.我也搜索了SO,但问题似乎就在附近Boost::tuple.

auto some = make_tuple("I am good", 255, 2.1);
Run Code Online (Sandbox Code Playgroud)

c++ tuples c++11

19
推荐指数
3
解决办法
2万
查看次数

重载operator << for std :: tuple - 可能的简化?

我使用 SO问题的答案"迭代元组"来编写一个重载方法<<.这个方法经过测试,似乎可以g++ 4.7在Debian squeeze上正常工作.

然而,这种方法有点迂回,因为它似乎<<无法明确实例化(我在这里发现了一篇关于它的帖子 ).因此,一个人被迫定义一个字符串方法,然后调用它.我有一个类似的矢量方法,更直接.有没有人建议如何消除创建字符串方法的额外步骤,使用相同的方法,或其他?提前致谢.

#include <tuple>
#include <iostream>
#include <string>
#include <sstream>
#include <vector>

using std::ostream;
using std::cout;
using std::endl;
using std::vector;
using std::string;

// Print vector<T>.
template<typename T> ostream& operator <<(ostream& out, const vector<T> & vec)
{
  unsigned int i;
  out << "[";
  for(i=0; i<vec.size(); i++)
    {
      out << vec[i];
      if(i < vec.size() - 1)
    out << ", ";
    }
  out << "]";
  return out;
}

////////////////////////////////////////////////////////////////

// …
Run Code Online (Sandbox Code Playgroud)

c++ templates tuples c++11 iterable-unpacking

7
推荐指数
1
解决办法
2355
查看次数

重载输出<< operator for class,以打印其中的元组

所以,如果我有这样的事情

template<typename... Args >
class tuple_class
{
  public:
  std::tuple<Args...> tup;

/*I left out the other functions */
};
Run Code Online (Sandbox Code Playgroud)

我想重载运算符<<,以便它在类上调用时递归打印元组.

恩.

auto a = tuple_class(1, 2 ,3);
std::cout << a << endl;
Run Code Online (Sandbox Code Playgroud)

希望打印'123'

我见过了元组打印机的其他例子,但我不能在没有麻烦的情况下将它应用到我的班级

我想我应该从这样的成员函数开始

  template<typename... Args>
  friend std::ostream& operator<<(std::ostream& os, const my_tuple<Args...> &m);
Run Code Online (Sandbox Code Playgroud)

然后是课外的实际功能

template<typename... Args>
std::ostream& operator<<(std::ostream& os, const my_tuple<Args...> &m)
{
   os << "SOMETHING" << std::endl;
   return os;
}
Run Code Online (Sandbox Code Playgroud)

当我在班上调用<<运算符时,这实际上有效.但我不知道如何让它实际打印元组.

任何帮助,将不胜感激

c++ iostream tuples operator-overloading

6
推荐指数
1
解决办法
303
查看次数

如何专门化模板函数以使其接受传递char数组作为参数?

// problem.cpp:
#include <string>

template<typename T> void func(const T & v);

int main() {
        int i;
        float f;
        char * cp;
        char ca[4];

        func(i);
        func(f);
        func(cp);
        func(std::string("std::string"));
        func(ca);
        func("string_literal");

        return 0;
}

// problem2.cpp
#include <string>

template<typename T> void func(const T & v);

// undefined reference to `void func<int>(int const&)'
template<> void func<int>(const int & v) { }

// undefined reference to `void func<float>(float const&)'
template<> void func<float>(const float & v) { }

// undefined reference to `void func<char*>(char* const&)' …
Run Code Online (Sandbox Code Playgroud)

c++ templates

5
推荐指数
1
解决办法
4201
查看次数

是否可以使用C ++ 17折叠表达式折叠部分包装?

我试图弄清楚如何使用C ++ 17折叠表达式仅折叠可变参数模板包的一部分。假设我想创建一个编译时的“分隔字符串”,例如"str1_str2_str3_....."

使用这样的代码可以很容易地做到这一点(仅作为示例):

std::string result;

template<class... Strings>
ConcatString(Strings&... strs)
{
    (ConcatString(strs), ...);
}

template <class String>
void ConcatString(String& str)
{
     result += str + "_"
}
Run Code Online (Sandbox Code Playgroud)

然后我们可以像这样执行它

std::string s1 = "s1", s2 = "s2", s3 = "s3";
ConcatString(s1, s2, s3);
// result == "s1_s2_s3_"
Run Code Online (Sandbox Code Playgroud)

如您所见,最后一个定界符存在问题。没有运行时检查,有什么办法可以避免此问题?我可以想象的一种解决方案是仅折叠(N-1)个arg,并“手动”连接最后一个。

c++ variadic-templates fold-expression c++17

5
推荐指数
2
解决办法
152
查看次数

在C++ 11中将(1元组到10元组)参数转换为n元组参数

可能重复:
Pretty-print std :: tuple

在数据库库(soci)中,下面有一大块代码可以处理std::tuple<>一到十个参数.

静态类方法from_base(),to_base()用于1元组到10元组的参数.

guts基本上将每个n元组元素传入传入的流中.一切都是硬编码的.

如何将此代码转换为使用C++ 11的可变参数模板(参数没有限制)? 实际上使用可变参数模板是次要的.我们真正想做的是用n-tuple参数的一般情况替换硬编码.

部分问题是,从技术上讲,只有一个参数,但该参数是一个n元组,所以我不能完全使用维基百科中的描述.什么是最好的方法?

#include "values.h"
#include "type-conversion-traits.h"
#include <tuple>

namespace soci
{

template <typename T0>
struct type_conversion<std::tuple<T0> >
{
    typedef values base_type;

    static void from_base(base_type const & in, indicator ind,
        std::tuple<T0> & out)
    {
        in
            >> std::get<0>(out);
    }

    static void to_base(std::tuple<T0> & in,
        base_type & out, indicator & ind)
    {
        out
            << std::get<0>(in);
    }
};

template <typename T0, typename T1>
struct type_conversion<std::tuple<T0, T1> …
Run Code Online (Sandbox Code Playgroud)

c++ tuples variadic-templates c++11

2
推荐指数
1
解决办法
437
查看次数

完美的转发和功能参数评估的顺序

是否有一种很好的方法可以将函数的参数转发fg类似情境中的函数

template<typename... T>
void g(T && ... x);

template<typename... T>
void f(T && ... x)
{
    g(x..., x...);
}
Run Code Online (Sandbox Code Playgroud)

在下一个代码中x可以移动两次

template<typename... T>
void f(T && ... x)
{
    g(std::forward<T>(x)..., std::forward<T>(x)...);
}
Run Code Online (Sandbox Code Playgroud)

在下一个代码std::forward<T>(x)...之前可以进行评估x...

template<typename... T>
void f(T && ... x)
{
    g(x..., std::forward<T>(x)...);
}
Run Code Online (Sandbox Code Playgroud)

c++ templates rvalue-reference c++11

2
推荐指数
1
解决办法
247
查看次数

C++ 中 [] 的可变参数运算符重载

我希望使用运算符 [] 中传递的表达式。我认为使用变量模板参数可以解决问题,但我错了......在 c++11 中是否有一种方法可以做到这一点?

class object {
 

private:


public:
  void values() { std::cout << "finished" << std::endl; }
  template <typename T, typename... Type> void values(T arg, Type... args) {

    std::cout << arg << "  " << std::endl;
    values(args...);
  }


   template<typename... Type> void operator[](Type... args) {

       values(args...);
  }
};

int main(void) {
  object o1 = object();

  o1.values(1, 6.2, true, "hello"); // Works fine.
  
  o1[1, 6.2, true]; // Only the last value gets printed eg. true
  

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

更广泛的目标是我被要求为此制定一个工作语法

let …
Run Code Online (Sandbox Code Playgroud)

c++ templates operator-overloading c++11

0
推荐指数
1
解决办法
308
查看次数