[英]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.