News for hackers. Stuff that matters.
Re:C++20 Idioms for Parameter Packs by mgaunard on Tuesday February 27, 2024 @09:34AM (#39524572)
Pretty bad "idioms"; anything involving recursive template instantiations is a terrible idea.

How to use fold expressions on operator comma isn't even touched on.

Re:C++20 Idioms for Parameter Packs by corysama on Tuesday February 27, 2024 @10:34AM (#39525264)
Is the section on “Comma Fold” (right after the recursion section) not what you are looking for?

https://www.scs.stanford.edu/~dm/blog/param-pack.html#comma-...

Re:C++20 Idioms for Parameter Packs by mgaunard on Wednesday February 28, 2024 @08:04AM (#39537318)
You mean way after he introduced the bad way of doing things? Looks like an afterthought.
Re:C++20 Idioms for Parameter Packs by CoastalCoder on Tuesday February 27, 2024 @09:41AM (#39524678)
My 2 cents: it's a bad idea because it's hard to test / debug.

C++ template / overload resolution involves some very convoluted logic. And it can take some work to even notice if / how it went differently than a programmer expected.

Programmers typically have logging, interactive debugging, etc. to investigate complicated algorithms like this. But (almost?) no C++ compiler provides such tooling for investigating the behavior of this algorithm.

IMHO it's an area where C++ tooling could serious use improvement.

Re:C++20 Idioms for Parameter Packs by nix0n on Tuesday February 27, 2024 @10:55AM (#39525545)
This is why the C preprocessor is superior to templates: gcc's "-E" option will show you the preprocessed source file. (I think clang also?)

My personal theory is that compiler authors have not provided a template equivalent, because they are embarrassed about the code that's being produced.

(If you disagree, prove me wrong!)

Re:C++20 Idioms for Parameter Packs by planede on Tuesday February 27, 2024 @12:06PM (#39526493)
cppinsights.io shows expanded function templates as explicit specializations. It's built on LLVM, but I don't think that this tool is upstreamed.

https://cppinsights.io/lnk?code=dm9pZCBmb28oYXV0bykge30KCnZv...

Re:C++20 Idioms for Parameter Packs by nix0n on Tuesday February 27, 2024 @12:22PM (#39526694)
Thank you! This is exactly the sort of thing I was looking for.

I found the source at https://github.com/andreasfertig/cppinsights

Re:C++20 Idioms for Parameter Packs by gpderetta on Tuesday February 27, 2024 @11:05AM (#39525699)
> prove me wrong

Template don't "produce code". They get expanded well after parsing. There is no code to be embarrassed for.

Also you can ask GCC to dump any intermediate state: https://gcc.gnu.org/onlinedocs/gcc/Developer-Options.html.

Re:C++20 Idioms for Parameter Packs by nix0n on Tuesday February 27, 2024 @11:26AM (#39525971)
Is there a specific "-fdump" that you recommend?
Re:C++20 Idioms for Parameter Packs by actionfromafar on Tuesday February 27, 2024 @09:58AM (#39524864)
Yes! I never thought of it that way, but imagine having a real nice IDE with a "compilation debugger", showing all these things unfolding in real-time as you change a function.
Re:C++20 Idioms for Parameter Packs by logicchains on Tuesday February 27, 2024 @02:01PM (#39528124)
You have static_assert for testing/debugging. The lovely thing about compile-time programming is you don't even need a separate test stage; the compiler runs your tests (asserts) for you. Then if the code builds you know it's correct.

This pattern is getting easier and easier in modern C++ as more and more thing are made constexpr.

Re:C++20 Idioms for Parameter Packs by gpderetta on Tuesday February 27, 2024 @10:31AM (#39525231)
There is in fact a whole section on comma folds.

Aside from the fact that the articles shows many use cases where packs and fold expressions obviate the need for recursion, what's so bad about recursive template instantiations?

Re:C++20 Idioms for Parameter Packs by corysama on Tuesday February 27, 2024 @11:01AM (#39525641)
If you can use a comma fold instead of recursion, please do. They are a small hurdle to learn and, after that, much easier to follow.
Re:C++20 Idioms for Parameter Packs by mazieres on Tuesday February 27, 2024 @01:28PM (#39527617)
Obviously there's a whole section on comma folds that you didn't read. However, more importantly, there are things that you can't do without recursion. For example, how would you implement the `index_string` function in the section on recursing over template parameters without using recursion?
Re:C++20 Idioms for Parameter Packs by mgaunard on Tuesday February 27, 2024 @06:30PM (#39531694)
There is zero need for template recursion here, or even templates at all.

The functionality can be computed as a simple constexpr function.

A string as a char template parameter pack is a textbook example of an antipattern.

Re:C++20 Idioms for Parameter Packs by mazieres on Tuesday February 27, 2024 @08:34PM (#39532782)
Actually not. Try to implement a compile-time initialized const char* that represents some compile-time value like sizeof(X) for some data structure X. You'll see that you need recursion.

A place where this kind of pattern is useful is in having a generic accessor type for fields, and wanting to extend it to tuples. So for example accessor(x) might return x.field, and accessor.name might be "field." To make it work for tuples, you need a string for every possible tuple index. E.g.:

  template<typename T, size_t N> struct tuple_accessor;
  template<typename...T, size_t N>
  struct tuple_accessor<std::tuple<T...>, N> {
    constexpr decltype(auto) operator(auto &&t) const {
      return get<N>(std::forward<decltype(t)>(t));
    }
    static constexpr const char *name = index_string<N>();
  };
Re:C++20 Idioms for Parameter Packs by mgaunard on Wednesday February 28, 2024 @08:31AM (#39537611)
for demonstration purposes only.

  #include <array>
  #include <tuple>

  constexpr std::array<char, 11> itos(unsigned n) {
      std::array<char, 11> s;
      unsigned i = 0;
      while (n) {
          s[i++] = '0' + (n % 10);
          n /= 10;
      }
      s[i] = '\0';
      return s;
  }
  template<auto V>
  struct static_value {
      static constexpr auto value = V;
  };

  template<class T, unsigned N>
  struct tuple_accessor;
  
  template<class...T, unsigned N>
  struct tuple_accessor<std::tuple<T...>, N> {
      static constexpr const char *name = static_value<itos(N)>::value.data();
  };
Re:C++20 Idioms for Parameter Packs by mazieres on Wednesday February 28, 2024 @11:05PM (#39546301)
Your constexpr function is not legal because it doesn't initialize all the array elements, even though the compiler might let you get away with it. That's easily fixed. More importantly, though, your static_value::value is not a const char *.
Re:C++20 Idioms for Parameter Packs by mgaunard on Thursday February 29, 2024 @03:14AM (#39547377)
That restriction was lifted in 2020.

tuple_accessor::name is a const char* which is what you asked for. static_value here is an implementation detail and the type of its members is irrelevant.

Re:C++20 Idioms for Parameter Packs by planede on Wednesday February 28, 2024 @06:00AM (#39536414)
You don't need recursion, but you do need a template, AFAIK.

https://godbolt.org/z/o53o53W5r

Re:C++20 Idioms for Parameter Packs by angiosperm on Wednesday February 28, 2024 @04:57PM (#39543989)
Why does the

  <size_t ...Idxs>
construct work, when we needed same_as<char>?
Re:C++20 Idioms for Parameter Packs by planede on Thursday February 29, 2024 @04:22AM (#39547768)
Context. I assume you mean something like `void foo(size_t ...Idxs)`, which indeed doesn't work. It can't work, as nothing indicates that this would be a template, and it should be at least templated on the size of the pack.

<size_t ...Idxs> works because it introduces a pack that is a template parameter, so it naturally gets templated on the size of the pack (as well as on the values).

I guess an other historical issue for the grammar is that without the parameter name, `void foo(size_t ...)` is already valid grammar, and is equivalent to `void foo(size_t, ...)`, a C-style variadic.