卡在C ++元编程中

问题描述 投票:0回答:1

[我试图拿着一本名为Practical C++ Metaprogramming的书进入TMP,但我一直想尝试推导第一个例子中的一个...

[我的目标是制作一个模板函数call,该函数采用具有多个不相关类型的参数的函数,然后返回带有参数的该函数的计算。

问题的根本原因是,我无法使用适当的参数类型实例化结构(makeTupleOfParams的良好专业化),该结构将允许我定义输入函数参数的类型,[ C0]在我的代码中。

我不明白为什么会出现这个问题,因为构建输出中的Function签名似乎模棱两可,无法用专业tupleOfParamTypes_t来标识参数的类型。我不明白为什么不会用正确的成员<Return(Args...)>生成此结构,这似乎是所有这些的关键。

这里是全部:

using type = std::tuple<Args...>;

以及构建输出:

#include <tuple>

// base template
template<typename Function>
struct makeTupleOfParams;

// template specialization to identify parameters
template <typename Return, typename... Params>
struct makeTupleOfParams<Return(Params...)>
{
    using type = std::tuple<Params...>;
};

// shortcut to identify type of parameters
template <typename Function>
using tupleOfParamTypes_t = typename makeTupleOfParams<Function>::type;

// function to unroll a tuple of parameters on a function
template <typename Function, typename Params, size_t... Index>
auto dispatchParams(Function f, Params p, std::index_sequence<Index...>)
{
    return f(std::get<Index>(p)...);
}

template <typename Function, typename... Params>
auto call(Function f, Params... p)
{
    // getting size of Params and argument types of Function
    constexpr size_t paramsCount = sizeof...(Params);
    tupleOfParamTypes_t<Function> params;

    return dispatchParams(f, params, std::make_index_sequence<paramsCount>());
}

auto f(int i, float j) -> decltype(i+j)
{
    return i + j;
};

void main()
{
    call(f, 1, 2.0);
}
c++ metaprogramming template-meta-programming
1个回答
0
投票

[当您调用1 > ------Build started : Project: TMP, Configuration : Debug Win32------ 1 > main.cpp 1 > d:\git\meta - cpp - sandbox\src\main.cpp(40) : warning C4326 : return type of 'main' should be 'int' instead of 'void' 1 > d:\git\meta - cpp - sandbox\src\main.cpp(16) : error C2794 : 'type' : is not a member of any direct or indirect base class of 'makeTupleOfParams<Function>' 1 > with 1 > [ 1 > Function = float(__cdecl *)(int, float) 1 > ] 1 > d:\git\meta - cpp - sandbox\src\main.cpp(28) : note: see reference to alias template instantiation 'tupleOfParamTypes_t<float(__cdecl *)(int,float)>' being compiled 1 > d:\git\meta - cpp - sandbox\src\main.cpp(41) : note: see reference to function template instantiation 'auto call<float(__cdecl *)(int,float),int,double>(Function,int,double)' being compiled 1 > with 1 > [ 1 > Function = float(__cdecl *)(int, float) 1 > ] 1 > d:\git\meta - cpp - sandbox\src\main.cpp(26) : error C2938 : 'tupleOfParamTypes_t' : Failed to specialize alias template 1 > d:\git\meta - cpp - sandbox\src\main.cpp(31) : error C2672 : 'dispatchParams' : no matching overloaded function found 1 > d:\git\meta - cpp - sandbox\src\main.cpp(26) : error C2893 : Failed to specialize function template 'auto dispatchParams(Function,Params,std::integer_sequence<unsigned int,_Ix...>)' 1 > d:\git\meta - cpp - sandbox\src\main.cpp(26) : note: With the following template arguments : 1 > d:\git\meta - cpp - sandbox\src\main.cpp(26) : note: 'Function=float (__cdecl *)(int,float)' 1 > d:\git\meta - cpp - sandbox\src\main.cpp(26) : note: 'Params=unknown-type' 1 > d:\git\meta - cpp - sandbox\src\main.cpp(26) : note: 'Index={0, 1}' 1 > Done building project "TMP.vcxproj" --FAILED. ========== Build: 0 succeeded, 1 failed, 0 up - to - date, 0 skipped ========== 函数时,您将函数call作为参数传递。但是,c ++会将参数隐式转换为函数指针。因此,在构造别名时,模板参数实际上是f,而不是int(*)(int,float)。由于这不满足部分专用模板的要求,因此编译器尝试从非专用模板为makeTupleOfParams构造类型别名。但是,未特殊化的模板不包含类型别名“ type”,这会导致编译错误。

© www.soinside.com 2019 - 2024. All rights reserved.