#c #c 20
#c #c 20
Вопрос:
Как сделать один шаблон, чтобы его можно было вызывать с несколькими параметрами, не создавая ненужных перегрузок с повторением кода
У меня есть шаблон что-то вроде этого
struct demo {
template <class T1, class T2, class T3>
demo(T1amp;amp; tipe_1, T2amp;amp; tipe_2, T3amp;amp; tipe_3) {
// code that is too lazy to repeat
std::filesysteam::create_directories(tipe_1 / tipe_2);
}
// I could do this, but I don't want to repeat a lot of code from the template, I showed this as an
// example of what I want to achieve
template <class T1,class T3>
demo(T1amp;amp; tipe_1, T3amp;amp; tipe_3) {
// code that is too lazy to repeat
std::filesysteam::create_directories(tipe_1);
}
}
int main () {
demo(tipe_1,tipe_2,tipe_3);
demo(tipe_1,tipe_3);
return 0;
}
Комментарии:
1. ИМХО: это слишком сильно зависит от варианта использования для соответствующего ответа. Существует множество решений: вариационные шаблоны, цепные CTORs, частная / статическая функция с дублированным кодом, …
2. @SimonKraemer Вполне приемлемо, чтобы было несколько решений. Каждый ответ может показать различный подход к решению проблемы.
Ответ №1:
Вы должны быть в состоянии использовать C 17-кратные выражения для этого:
template <typename... Ts>
void createFullPath(Tsamp;amp;... components)
{
std::filesystem::create_directories((std::filesystem::path{components} / ...));
}
Обратите внимание, что для этого требуется, чтобы все Ts
они имели надлежащую operator/
функциональность, которая сделала бы их std::filesystem::path
или эквивалентными
В общем, это действительно зависит от того, что вы хотите сделать с аргументами, как написать общий шаблон.
Комментарии:
1. Я не очень понимаю, как будет работать этот патч, нужно ли писать его внутри шаблона? вроде так или что?
createFullPath(tipe_1, tipe_2);
2. Второй пример так работать не будет. Это добавило бы параметры не шаблонного типа типа std::filesystem::path (что, я думаю, невозможно). Это не добавило бы возможности иметь несколько аргументов этого типа, а скорее ввело бы компоненты в качестве аргументов времени компиляции.
3. к сожалению, я пока не могу использовать этот код, но я пытаюсь что-то придумать
4. RHS
std::filesystem::path::operator/
не обязательно должно бытьstd::filesystem::path
, это может быть строка5. компилятор что-то не понимает в этой строке
std::filesysteam::create_directories(components / ...);