だから私は可変個引数テンプレートをもう少し理解しようとしてきました.私の目標はすべての型を受け取り、それらを展開し、それらを印刷することでした..関数のためにそれを行うことができました(いくつかの例を見つけました)クラスのためにそれを行うことができますここでは、多くの「スレーブ」を保持する「マスター」を構築しようとしています。各スレーブは、彼から継承した 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;
}
ありがとう!
アロン