簡體   English   中英

枚舉可變參數模板參數包

[英]Enumerate variadic template parameter pack

我有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

你可能會這樣做:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM