【发布时间】:2018-07-20 08:33:45
【问题描述】:
您好,如何使用像 20,000 个元素这样的大元素使其打印效率更高? 我花了很长时间编译, 我试着遵循这个 static const array of values in Variadic Template C++
但是我不能让它与折叠表达式一起工作,任何想法如何解决这个问题
#include <iostream>
template<typename T = int , typename Comp=std::less<T>>
struct Facility
{
template<T ... list>
struct List
{
static void print()
{
// store in static array to compile faster
constexpr static T args[sizeof...(list)] = {list...};
// use for idiom for each except the last, but this time in reserve way
// assgn char* space to empty char first
const char* space = "";
if (sizeof...(list) == 0)
{
// simple just call space to cout , if not warning no variable used
std::cout <<'"' <<"Empty List" <<'"' << space <<std::endl;
}
else if (std::is_same<T, char>::value)
{
std::cout << '"';
((std::cout << space << args), ...);// compile error
// simple just call space to cout , if not warning no variable used
std::cout << '"' << space<< std::endl;
}
else
{
std::cout << '"';
// fold expression bracket,L side will execute first
// the first round space is empty and later on become space
(((std::cout << space << list), space = " "), ...);
std::cout << '"' << std::endl;
}
}
};
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...>;
int main()
{
std::cout << "********Testing Basic List Capabilities*********\n";
using List1 = IntList<1,2,3,4>;
using List2 = IntList<9, 0, -1, -200>;
using List3 = IntList<LONG20000LIST>;
List1::print();
List2::print();
List3::print();
using String1 = CharList<'a', 'b', 'c'>;
using String2 = CharList<' ', 'w', 'o', 'r', 'l', 'd' >;
using EmptyString = CharList<>;
String1::print();
String2::print();
EmptyString::print();
std::cout << "************Finished Testing *******************\n\n";
}
【问题讨论】:
-
#define LONG20000LIST 0, 1, 2, 3, 4, 5, 6, 7, 8 ,9, 0, 1, 2, 3, 4, 5, 6, 7, 8 ,9 , 0, 8 ,9, 0, 1, 2, 3, 4, 5, 6, 7, 8 ,9, 0, 1, 2, 3, 4, 5, 6, 7, 8 ,9, 0, 1 , 2, 3, 4, 5, 6, 7, 8 ,9, 0, 1, 2, 3, 4, 5, 6, 7, 8 ,9, 0, 1, 2, 3, 4, 5, 6 , 7, 8 ,9, 0, 1, 2, 3, 4, 5, 6, 7, 8 ,9, 0, 1, 2, 3, 4, 5, 6, 7, 8 ,9, 0, 1 , 2, 3, 4, 5, 6, 7, 8 ,9, 0, 1, 2, 3, 4, 5, 6, 7, 8 ,9, 0, 1, 2, 3, 4, 5, 6 , 7, 8 ,9, 0, 1, 2, 3, 4, 5, 6, 7, 8 ,9, 0, 1, 2, 3, 4, 5, 6, 7, 8 ,20000
-
我无法添加 20000 列表定义,超过字符限制
-
为什么要把这20000个元素列表表示为编译时间常数?你不能把它塞进一个向量然后
copy它到一个std::experimental::ostream_joiner吗? -
stackoverflow.com/questions/46454659/… 找到了解决方案,您不能在这种情况下使用 std::experimental::ostream_joiner
标签: c++ c++17 fold-expression