Итак, я пытался немного больше понять вариативные шаблоны. Моя цель состояла в том, чтобы получить все типы, расширить их и распечатать. Я смог сделать это для функции (нашел несколько примеров), но я не был в состоянии сделать это для класса. Здесь я пытаюсь создать «Мастер», чтобы содержать много «Рабов», каждый раб должен иметь наследуемый от него Slave_T, а затем знать его тип и печатать его на c'tor.
Но по какой-то причине я не могу исправить неоднозначную ошибку компиляции. Я пытался избежать передачи какого-либо типа в качестве параметров функции. Я пытался с соглашениями enable_if или true/false_type, но не смог, кто-нибудь знает ? Это мой код: (расширение функций включено)
Расширение функций, которое работает:
template<typename T, typename... Targs>
void Print(T value, Targs... Fargs) // recursive variadic function
{
Print<T>();
Print(Fargs...); // recursive call
}
template<typename T>
void Print(T = NULL)
{
std::cout << typeid(T).name() << endl;
}
Расширение класса, с которым мне нужна помощь:
#include <iostream>
#include <vector>
#include <type_traits>
#include <memory>
using namespace std;
struct Slave {
virtual char const* Type() = 0;
};
template<typename T>
struct Slave_T : public Slave{
virtual char const* Type() {
return typeid(T).name();
}
};
template <typename ...T>
struct Master {
Master()
{
MakeSlave<T...>();
cout << "All Slaves:" << endl;
for (auto const& slave : v){
cout << slave ->Type() << endl;
}
}
private:
template<typename T, typename ...Rest>
void MakeSlave()
{
MakeSlave<Rest...>(); MakeSlave<T>();
}
template<typename T>
void MakeSlave() {
v.push_back(new Slave_T<T>());
}
vector<shared_ptr<Slave>> v;
};
int main()
{
Master<int, double, char> m;
//Print("Hello", '!', 123, 123);
return 0;
}
Спасибо!
Алон