簡體   English   中英

實用的C ++元編程

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

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