[英]Extracting C Function's Parameters Using C++ Metaprogramming (Example from “Practical C++ Metaprogramming”)
[英]Practical C++ Metaprogramming
我剛讀過“Practical C ++ Metaprogramming”這本書,它有以下我無法編譯的例子。 你能幫忙解決這個問題。
template <typename F>
struct make_tuple_of_params;
template <typename Ret, typename... Args>
struct make_tuple_of_params<Ret (Args...)>
{
using type = std::tuple<Args...>;
};
template <typename F>
using make_tuple_of_params_t = typename make_tuple_of_params<F>::type;
template<typename F>
void some_magic_function(F callable)
{
make_tuple_of_params_t<F> tuple;
/*
... do something with arguments in tuple...
*/
}
int main()
{
some_magic_function([] (int, double, float) {});
}
我收到一個編譯錯誤說:'type'不是'make_tuple_of_params'的任何直接或間接基類的成員。 由於選擇了默認結構,因此SFINAE無法按預期工作。 我該如何解決?
[] (int, double, float) {}
類型是main
本地未命名類類型,稱為閉包類型。 絕對不是 void (int, double, float)
; 事實上它根本不是一種功能類型。 因此,函數類型的特化不適用,並且選擇了主模板。 (請注意,您的代碼中不涉及SFINAE)。
至於如何解決這個問題:我認為沒有一個完全通用的解決方案。 特定的some_magic_function
可能有解決方案/解決方法,但這取決於您需要該功能做什么。
對於lambdas,如果不包括帶有自動參數的lambda,則解決方法可能如下所示:
#include <tuple>
#include <typeinfo>
#include <iostream>
template <class>
struct make_tuple_of_params;
template <class Res, class Type, class... Args>
struct make_tuple_of_params<Res (Type::*)(Args...) const> {
using type = std::tuple<Args...>;
};
template <class F>
using make_tuple_of_params_t = typename make_tuple_of_params<F>::type;
template<typename F>
void some_magic_function(F callable)
{
make_tuple_of_params_t<decltype(&F::operator())> tuple;
std::cout << typeid(tuple).name() << std::endl;
}
int main()
{
some_magic_function([] (int, double, float) {});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.