【问题标题】:Constructing a type using parameter pack of types and an input array of corresponding values使用类型参数包和对应值的输入数组构造类型
【发布时间】:2016-05-14 03:41:25
【问题描述】:

在发布这个问题之前,我已经尝试适应here、here 和here 中提到的方法。但是,没有什么能解决我的要求,因为我有一个需要调整的中间函数。

基本上,我所拥有的如下。我必须根据类型存储在参数包Args 中的参数和数组ARGValue *ptr 中的相应值来构造类型T

但是,要将类型的值从 ARGValue* ptr 映射到 Args... 中的类型 我需要做一个中间操作,如下所示。

    // 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) ;
            }   
        };  

我该如何解决这个问题?如何安全地从ARGValue* 中获取Args... 中所有类型的值,然后构造类型T?

我不想为多个参数创建特化,因为它可能会使代码混乱。

【问题讨论】:

  • 是否有可能从元组中提供参数值?
  • @Quentin Nope。仅单独/单独的参数。

标签: c++ c++11 variadic-templates stdtuple


【解决方案1】:

看来你想要:

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])))...) ;
    }
};

【讨论】:

  • std::make_index_sequence 在这里不受我们的编译器支持。 :( :(
  • @Recker 网上有很多实现。喜欢these。
猜你喜欢
  • 2020-03-07
  • 1970-01-01
  • 2015-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-17
  • 2010-12-05
  • 2012-09-22
相关资源
最近更新 更多