【问题标题】:Enumerate variadic template parameter pack枚举可变参数模板参数包
【发布时间】:2019-01-30 17:28:30
【问题描述】:

我有 std::vector<val_t>val_t - 我自己的 std::any 实现),它包含我要调用的函数的参数和一个参数包 Args,其中包含该函数的参数类型。

using arg_pack_t = std::vector<val_t>;

template <typename R, typename... Args>
class function_reflector_t<R (*)(Args...)> {
    typedef R (*c_function_t)(Args...);
    using reflected_t = signature_reflector_t<R, Args...>;

  public:
    static function_metadata_t reflect(std::string name, c_function_t c_function)
    {
        // HERE! 
        universal_wrapper_t invoke = [](arg_pack_t args) -> val_t {
            return args[0].as<c_functon_t>()(args[??? + 1].as<Args>()...);
        };

        return {
            reinterpret_cast<void *>(c_function),
            nullptr,
            invoke,
            std::move(name),
            reflected_t::arguments(),
            reflected_t::return_type(),
        };
    }
};

要调用此函数,我需要将参数类型与相同参数的索引相关联,因此在完成所有模板实例化之后,编译器可以生成与以下内容等效的代码:

universal_wrapper_t invoke = [](arg_pack_t args) -> val_t {
            return args[0].as<c_functon_t>()(args[1].as<int>(), args[2].as<double>());
        };

我阅读了有关std::integer_sequence 的信息,但我无法想出在这种情况下使用它的方法。 理想情况下,我需要一些像 std::index_sequence_for 这样的模板,而不是 size_t 提供一个类型,该类型具有索引和该索引处的类型的别名,所以它的行为有点像 python 的 enumerate

【问题讨论】:

    标签: c++ variadic-templates


    【解决方案1】:

    你可能会这样做:

    template <std::size_t ... Is>
    static function_metadata_t reflect(std::string name,
                                       c_function_t c_function,
                                       std::index_sequence<Is...>)
    {
        universal_wrapper_t invoke = [](arg_pack_t args) -> val_t {
            return args[0].as<c_functon_t>()(args[Is + 1].as<Args>()...);
        };
    
        return {
            reinterpret_cast<void *>(c_function),
            nullptr,
            invoke,
            std::move(name),
            reflected_t::arguments(),
            reflected_t::return_type(),
        };
    }
    
    static function_metadata_t reflect(std::string name, c_function_t c_function)
    {
        return reflect(name, c_function, std::index_sequence_for<Args...>());
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-01
      • 1970-01-01
      • 2020-04-29
      • 2012-04-16
      • 1970-01-01
      相关资源
      最近更新 更多