简体   繁体   English

C ++ 17倍表达语法

[英]c++17 fold expression syntatx

I have problem of make code working of fold expression in line 18 and line 23 我在第18行和第23行的折叠表达式的make代码工作问题

I want make it such as have this result 我想要取得这样的结果

"1 2 3 4"
"9 0 -1 -200"
"abc"
" world"
"Empty List"

As if the list is empty you will print "Empty List" , if not, if the type is char it won't print space and if the type is not char , it will print space in between. 好像列表是空的,您将打印"Empty List" ,如果不是,则类型为char时将不打印空间,如果类型为char则将在两者之间打印空间。

I tried using ((std::cout<<" " << list), ...); 我尝试使用((std::cout<<" " << list), ...); but it will print extra space which I don't want so I store in a temp string and later erase it. 但是它会打印多余的空间,因此我将其存储在临时字符串中,然后再将其擦除。

Anyone can help? 有人可以帮忙吗?

#include <iostream>
#include <string>
template<int ... intlist>
using IntList = typename Facility<int>::List<intlist...>;

template<char ... charlist>
using CharList = typename Facility<char>::List<charlist...>;

template<short ... shortlist>
using ShortList = typename Facility<short>::List<shortlist...>;

template<unsigned short ... shortlist>
using UnsignedShortList = typename Facility<unsigned short>::List<shortlist...>;

template<long ... list>
using LongList = typename Facility<long>::List<list...>;

template<typename T , typename Comp=std::less<T>>
struct Facility
{
  template<T ... list> 
  struct List
  {
    static void print()
    {
      std::string str; 
      str ="\"";
      if(sizeof...(list)== 0)
      {
         str+="Empty List";
      }
      else if (std::is_same<T, char>::value)
      {
        str+=(... + list);
         //((std::cout<< list), ...);
      }
      else
      {
        str+=((" " + list), ...);
        //((std::cout<<" " << list), ...);
        str.erase(0,1);
      }
      str+="\"";
      std::cout << str << std::endl;
    }  
  }; 
};

int main()
{
    using List1 = IntList<1,2,3,4>;
    using List2 = IntList<9, 0, -1, -200>;
    List1::print();
    List2::print();

    using String1 = CharList<'a', 'b', 'c'>;
    using String2 = CharList<' ', 'w', 'o', 'r', 'l', 'd' >;
    using EmptyString = CharList<>;
    String1::print();
    String2::print();
    EmptyString::print();

  }

As I understand you might use: 据我了解,您可能会使用:

template<typename T>
struct Facility
{
    template <T ... list>
    struct List
    {
        static void print()
        {
            std::cout << '"';
            if constexpr (sizeof...(list) == 0)
            {
                 std::cout << "Empty List";
            }
            else if constexpr (std::is_same<T, char>::value)
            {
                ((std::cout << list), ...);
            }
            else
            {
                [[maybe_unused]]  const char* sep = "";
                (((std::cout << sep << list), sep = " "), ...);
            }
            std::cout << '"' << std::endl;
        }  
    }; 
};

With usage: 用法:

int main() {
    Facility<int>::List<>::print();
    Facility<int>::List<42, 42>::print();
    Facility<char>::List<'h', 'e', 'l', 'l', 'o'>::print();
}

Demo 演示

Another solution could be the use of a std::ostringstream and remove the last char (placing the space in last position) 另一种解决方案是使用std::ostringstream并删除最后一个字符(将空格放在最后一个位置)

    std::ostringstream oss;

    ((oss << list << ' '), ...);

    str += oss.str().substr(0, oss.str().size()-1);

The following is a full compiling example 以下是完整的编译示例

#include <string>
#include <iostream>
#include <sstream>

template<typename T , typename Comp=std::less<T>>
struct Facility
{
  template<T ... list> 
  struct List
  {
    static void print()
    {
      std::string str;

      str = "\"";

      if(sizeof...(list)== 0)
      {
         str += "Empty List";
      }
      else if (std::is_same<T, char>::value)
      {
        std::ostringstream oss;

        ((oss << list), ...);

        str += oss.str();
      }
      else
      {
        std::ostringstream oss;

        ((oss << list << ' '), ...);

        str += oss.str().substr(0, oss.str().size()-1);
      }

      str += "\"";

      std::cout << str << std::endl;
    }  
  }; 
};

int main ()
{
  Facility<int>::List<1, 2, 3, 4> f;

  f.print();
}

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

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