0

この質問を投稿する前に、ここ、ここ、ここで言及されているアプローチに適合するよう既に試みまし。ただし、いくつかの調整が必要な中間関数があるため、私の要件を解決することはできませんでした。

基本的に、私が持っているものは次のとおりです。型がパラメーター パックに格納され、対応する値が配列にT格納されている引数に基づいて、型を構築する必要があります。ArgsARGValue *ptr

ただし、タイプ from の値をARGValue* ptrタイプ inArgs... にマップするには、次のような中間操作を行う必要があります。

    // Specialization for 1 argument

        template<typename T,typename... Args>
        struct instance_helper<T,1,Args...>
        {   
            static T invokeConstructor(const ARGValue *ptr)
            {   
                // Intermediate operation
                typedef typename std::tuple_element<0, std::tuple<Args...> >::type TT;
                const auto val0 = *(someUglyCast<TT*>(ptr[0])) ;

                // Return the desired type 
                return T(val0);
            }
        };

     //Specialization for no argument

        template<typename T,typename... Args>
        struct instance_helper<T,0,Args...>
        {   
            static T invokeConstructor(const ARGValue*)
            {   
                return T(); 
            }   
        };  

     // General Case
        template<typename T,size_t packSize,typename... Args>
        struct instance_helper
        {   
            static T invokeConstructor(const ARGValue *ptr)
            {             
                // Do some recursive magic here for intermediate operation
                return T(//Do some recursive magic) ;
            }   
        };  

これを解決するにはどうすればよいですか?Args...からすべての型の値を安全に取得し、ARGValue*型を構築するにはどうすればよいTですか?

コードが乱雑になる可能性があるため、複数の引数の特殊化を作成したくありません。

4

1 に答える 1

3

あなたが望むようです:

template<typename T,size_t packSize,typename... Args>
struct instance_helper
{
    static T invokeConstructor(const ARGValue *ptr)
    {
         return invokeConstructor(std::make_index_sequence<packSize>{}, ptr);
    }   

private:
    template <std::size_t ... Is>
    static T invokeConstructor(std::index_sequence<Is...>, const ARGValue *ptr)
    {
        using Tuple = std::tuple<Args...>;
            // Do some recursive magic here for intermediate operation
        return T((*(someUglyCast<const std::tuple_element_t<Is, Tuple>*>(ptr[Is])))...) ;
    }
};
于 2016-02-04T13:48:17.940 に答える