Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;17倍表达综合征_C++_C++17_Fold Expression - Fatal编程技术网

C++ c++;17倍表达综合征

C++ c++;17倍表达综合征,c++,c++17,fold-expression,C++,C++17,Fold Expression,我在第18行和第23行中遇到了使折叠表达式的代码正常工作的问题 我想让它有这样的结果 "1 2 3 4" "9 0 -1 -200" "abc" " world" "Empty List" 如果列表是空的,您将打印“空列表”,如果不是,如果类型是char,它将不打印空格,如果类型不是char,它将在两者之间打印空格 我尝试使用((std::cout),据我所知,您可能会使用: template<typename T> struct Facility { template &

我在第18行和第23行中遇到了使折叠表达式的代码正常工作的问题

我想让它有这样的结果

"1 2 3 4"
"9 0 -1 -200"
"abc"
" world"
"Empty List"
如果列表是空的,您将打印
“空列表”
,如果不是,如果类型是
char
,它将不打印空格,如果类型不是
char
,它将在两者之间打印空格


我尝试使用
((std::cout),据我所知,您可能会使用:

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;
        }  
    }; 
};
模板
结构设施
{
模板
结构列表
{
静态无效打印()
{

std::cout另一种解决方案是使用
std::ostringstream
删除最后一个字符(将空格放在最后一个位置)

std::ostringstream oss;

((oss关于什么的帮助?问题到底是什么?你能提供调用代码吗。你好,我想改为使用折叠表达式保存参数包,我想改为存储到str中,然后编辑,然后coutyes确定,我忘记了,对不起
str+=(…+列表)
无法达到预期效果。追加一个字符,该字符是所有字符值的总和(截断为字符)谢谢,我从来没有想过设置commait后面部分的空格是C++17的等价物,我注意到使用此方法时如果性能有问题,如果有20000个元素它编译得非常慢,那么您可以尝试
static const T args[]={list…}
并使用for-loop版本。LOL这就是编码人员所说的模因。非常有趣。谢谢你们两位。
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;
        }  
    }; 
};
int main() {
    Facility<int>::List<>::print();
    Facility<int>::List<42, 42>::print();
    Facility<char>::List<'h', 'e', 'l', 'l', 'o'>::print();
}
    std::ostringstream oss;

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

    str += oss.str().substr(0, oss.str().size()-1);
#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();
}