** Я получил несколько предложений о том, чтобы сделать мою функцию чисто родовой, что сработало бы, но я бы предпочел ограничить функцию только тем, чтобы принимать Base и ее дочерние элементы.
Возникли проблемы при создании функции, которая может принимать аргументы базового типа класса шаблонов с переменным числом аргументов, в то время как функция будет фактически вызываться с классами, производными от Base. Я попробовал несколько вещей. Вот общая идея. Дано:
template<typename... Args> struct Base {
std::tuple<Args...> data;
... //other stuff
};
struct DerivedA : Base<string, int> {
};
struct DerviedB : Base<bool, string, int> {
};
Как правильно создать функцию, которая делает это:
string moosh_together(Base A, Base B) { //I only need access to Base's members
return get<0>(A.data) + get<1>(B.data);
}
main() {
DerivedA aThing;
get<0>(aThing.data) = "foo";
DerivedB bThing;
get<1>(bThing.data) = "bar'd";
cout << moosh_together(aThing, bThing) << endl;
}
Выход:
foobar'd
Я пробовал несколько вариантов функции moosh_together, ни одна из которых не работает. Если оставить это как выше, генерируется ошибка компилятора об отсутствующих аргументах шаблона. Я не уверен, как передать функции аргументы шаблона, которые определяют DerivedA и DerivedB.
Другие вещи, которые я пробовал (метод дробовика):
string moosh_together(Base<> A, Base<> B) {}
//err: conversion from 'DerivedA' to non-scalar type 'Base<>' requested
template<Base<typename... Args> T1, Base<typename... Args> T2>
string moosh_together(T1 A, T2 B) {}
//err: expected paramter pack before '...'
template<Base<Args...> T1, Base<Args...> T2>
string moosh_together(T1 A, T2 B) {}
//err: 'Args' was not declared in this scope