3

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

ありがとう!

アロン

4

1 に答える 1