From dc35a1a6e52b88e3d587b504ff6b1f20fbdef25c Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Thu, 28 Sep 2017 02:25:32 +0200 Subject: [PATCH] Investigation: add a solution for default initialisation of missing arguments ...still somewhat unsatisfactory, because - no clear compile error message when invoking pickArg with insufficient arguments - the default initialisation case in SelectVararg is duplicated and messy --- research/try.cpp | 35 ++++++++++++++++++++++++-------- src/lib/meta/variadic-helper.hpp | 2 +- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/research/try.cpp b/research/try.cpp index a880d5f14..8faa5d849 100644 --- a/research/try.cpp +++ b/research/try.cpp @@ -95,21 +95,21 @@ using lib::meta::BuildIndexSeq; using lib::meta::BuildIdxIter; -template -struct Pick +template +struct SelectVararg { template static auto get (ARG, ARGS ...args) { - return Pick::get (args...); + return SelectVararg::get (args...); } - static auto get() { return nullptr; } + static INIT get() { return INIT{}; } }; -template<> -struct Pick<0> +template +struct SelectVararg<0, INIT> { template static ARG @@ -118,9 +118,23 @@ struct Pick<0> return a; } - static auto get() { return nullptr; } + static INIT get() { return INIT{}; } }; +template +constexpr inline auto +pickArg (ARGS... args) + { + return SelectVararg::get (args...); + } + +template +constexpr inline auto +pickInit (ARGS... args) + { + return SelectVararg::get (args...); + } + using Arr = std::array; @@ -130,8 +144,8 @@ template Arr dispatch_ (IndexSeq,IndexSeq, ARGS...args) { - Arr arr{Pick::get(args...) ...}; - fun2 (Pick::get(args...) ...); + Arr arr{pickInit (args...) ...}; + fun2 (pickArg (args...) ...); return arr; } @@ -158,6 +172,9 @@ main (int, char**) auto arr = dispatch (2,3,4,5,6,7,8); cout << util::join(arr) << "| " << showSizeof(arr) <::Ascending; template - using After = typename BuildIndexSeq::template OffsetBy; + using After = typename BuildIndexSeq< (n>c)? n-c : 0>::template OffsetBy; }; template<>