实用的 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' 的任何直接或间接基 class 的成员。它看起来像 SFINAE 没有按预期工作,因为选择了默认结构。我该如何解决这个问题?
[] (int, double, float) {}
的类型是 main
本地的未命名 class 类型,称为 闭包类型。 它绝对是 不是void (int, double, float)
;它实际上根本不是函数类型。因此,函数类型的特化不适用,并且选择主模板。 (请注意,您的代码中不涉及任何 SFINAE)。
至于如何解决这个问题:我认为没有完全通用的解决方案。对于特定的 some_magic_function
,可能会有 solution/workaround,但这取决于您需要该函数做什么。
对于 lambda,如果不包括带有自动参数的 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) {});
}
我刚读完书"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' 的任何直接或间接基 class 的成员。它看起来像 SFINAE 没有按预期工作,因为选择了默认结构。我该如何解决这个问题?
[] (int, double, float) {}
的类型是 main
本地的未命名 class 类型,称为 闭包类型。 它绝对是 不是void (int, double, float)
;它实际上根本不是函数类型。因此,函数类型的特化不适用,并且选择主模板。 (请注意,您的代码中不涉及任何 SFINAE)。
至于如何解决这个问题:我认为没有完全通用的解决方案。对于特定的 some_magic_function
,可能会有 solution/workaround,但这取决于您需要该函数做什么。
对于 lambda,如果不包括带有自动参数的 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) {});
}