понедельник, 22 января 2024 г.

[prog.c++] Оказывается, в современном C++ параметры шаблона с дефолтными значениями можно располагать в начале списка параметров шаблона...

Был приятно удивлен тому, что вот это вполне себе компилируется и работает так, как мне и нужно:

#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(12345);
    f<at_least<3>>(12345);
    f<at_least<5>>(123);
}

Цынк

Так-то я со времен C++98 привык, что параметры шаблона со значениями по умолчанию идут в конце списка параметров шаблона. А тут потребовалось, чтобы они шли в начале. И оно раз и заработало.

Приятно.


На правах саморекламы: изобретаю велосипеды для себя, могу изобретать и для вас.

2 комментария:

sergegers комментирует...

Только перед вариадиками

eao197 комментирует...

@sergegers:

Да вроде не только: https://wandbox.org/permlink/IBpHsf4La3Jew7q8