Страницы

Поиск по вопросам

пятница, 24 января 2020 г.

Установка i-го параметра в шаблоне

#cpp #cpp11 #cpp14 #шаблоны_с++


Есть класс, у которого все параметры шаблона имеют значение по умолчанию:

template
class A {
    // ...
};


Как установить значение для параметра Ti, а значения остальных параметров оставить
по умолчанию?

A a; // как-то так хотелось бы


UPD

Будет здорово, если удастся найти решение, которое позволит задавать произвольное
количество аргументов, а остальные оставлять по умолчанию:

A a;

    


Ответы

Ответ 1



Есть одно решение, правда использует оно Boost.Hana. Удобства: Расширяемость: можно добавлять в конец новые шаблонные параметры Конструкция пишется один раз, нет смысла в куче usingов Никакого overhead'а, доступ к параметрам остался, все проверки во время компиляции На Ваш суд: #include namespace hana = boost::hana; template )> // параметры по умолчанию - int, float, double class BaseA { public: using Args = _Args; template // для доступа к аргументам шаблона using Arg = typename decltype(+Args{}[hana::size_c])::type; }; template // тип, который хотим поменять, и его позиция using fix_A_arg = BaseA::Args{}, hana::size_c), hana::size_c, hana::type_c))>; int main(int /*argc*/, char** /*argv*/) { using A = BaseA<>; static_assert(std::is_same_v, int>); static_assert(std::is_same_v, float>); static_assert(std::is_same_v, double>); using B = fix_A_arg; static_assert(std::is_same_v, bool>); static_assert(std::is_same_v, float>); static_assert(std::is_same_v, double>); using C = fix_A_arg; static_assert(std::is_same_v, int>); static_assert(std::is_same_v, struct Foo>); static_assert(std::is_same_v, double>); return 0; } Онлайн-проверка

Ответ 2



в качестве бредовой идеи, а вдруг кто-то вдохновится #include #include template class sample { T1 x; T2 y; }; template auto sample_get() { if constexpr (I == 1) { return sample(); } else if constexpr (I == 2) { return sample(); } } int main() { auto x = sample_get<1, float>(); std::cout << typeid(x).name() << std::endl; auto y = sample_get<2, double>(); std::cout << typeid(y).name() << std::endl; }

Комментариев нет:

Отправить комментарий