конструкторы, чем этот? (не добавляя U, например). Мне просто нужно, чтоб в зависимости от основного типа структуры некоторые конструкторы не включались.
template <class T>
struct A {
template <class U = T, std::enable_if_t<std::is_integral_v<U>, bool> = true>
A() {}
template <class U = T, std::enable_if_t<!std::is_integral_v<U>, bool> = true>
A() {}
};
В данном случае, возможно, подойдёт if constexpr А в общем случае есть... лишь более сложные способы с наследованием от условно выбираемой базы В C++20 концепты решают эту проблему by design, но, полагаю, этот вариант тоже не устроит
а if constexpr, кажется, можно использовать только в теле конструктора?
Да, если допустимо, то логику можно вынести из member initializer list в тело
Скорее всего нет, может я вообще иду не по тому пути, я решаю такую проблему: https://godbolt.org/z/Yb3jMW57x я бы хотел иметь конструктор от const &T, но если я подаю туда строковый литерал, он приходит как char[] а не как char* и дальше из-за этого всё ломается. Поэтому я пытаюсь сделать конструктор от T для массивов, наверное.
Возможно, требовалось такое решение? Хотя я не уверен, что полностью понял постановку задачи
в таком случае T выводится как const char, а хотелось бы чтоб const char*
К слову, о if constexpr: Есть ли какая-нибудь constexpr конструкция тернарного оператора? Что-то по типу template<class _Arg> constexpr auto foo(_Arg arg){ return constexpr std::is_integral_v<std::decay_t<_Arg>> ? std::to_string(arg) : arg; } Взамен if constexpr(std::is_integ......){ ...; } else { ......; }
может, это? https://en.cppreference.com/w/cpp/types/conditional
Может быть, но я именно про тернарный оператор
@anton934, можно пойти дальше и вернуть разделение на два конструктора при желании — здесь типы T и U будут различаться. U всё так же выведется в const char, но T будет корректен
о, большое спасибо, то есть всё решилось через deduction guide?
Кажется, я случайно отредактировал сообщение вместо отправки...
Я случайно затёр оригинальное сообщение, сейчас на его месте вариант, на мой взгляд по-лучше. Да, deduction guide позволяет вывести T независимо от U и пользоваться удобствами обоих типов
а тогда ещё такой вопрос, кажется, U и U&& в deduction guide работают одинаково? ( я не смог увидеть отличий, перебором разных вариантов )
Я думаю, его даже до template <class U> A(U) -> A<U>; можно упростить Т.е. decay сам собой сработает внутри deduction guide, тип будет выведен, но реальные конструкторы получат реальные аргументы
здорово, а ещё оказалось, можно не делать конструктор шаблонным, в первом варианте https://godbolt.org/z/YE7nYW81j
Обсуждают сегодня