Был приятно удивлен тому, что вот это вполне себе компилируется и работает так, как мне и нужно:
#include <iostream> struct no_size_limit { static bool is_size_valid(std::size_t /*size*/) { std::cout << "no_size_limit::ensure_valid_size" << std::endl; return true; } }; template<typename Size_Limiter=no_size_limit, typename... Args> void f(Args && ...args) { if(Size_Limiter::is_size_valid(sizeof...(args))) { std::cout << "processing of args" << std::endl; } else std::cout << "ignoring args" << std::endl; } template<std::size_t N> struct at_least { static bool is_size_valid(std::size_t size) { std::cout << "at_least<" << N << ">::ensure_valid_size" << std::endl; return (N <= size); } }; int main() { f(1, 2, 3, 4, 5); f<at_least<3>>(1, 2, 3, 4, 5); f<at_least<5>>(1, 2, 3); } |
Так-то я со времен C++98 привык, что параметры шаблона со значениями по умолчанию идут в конце списка параметров шаблона. А тут потребовалось, чтобы они шли в начале. И оно раз и заработало.
Приятно.
На правах саморекламы: изобретаю велосипеды для себя, могу изобретать и для вас.
Только перед вариадиками
ОтветитьУдалить@sergegers:
ОтветитьУдалитьДа вроде не только: https://wandbox.org/permlink/IBpHsf4La3Jew7q8