Как сделать несколько параметров в шаблоне для вызова без перегрузок?

#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 / ...);