gpt4 book ai didi

c++ - 这个程序调用带有参数包的函数指针有什么问题?

转载 作者:可可西里 更新时间:2023-11-01 15:22:47 25 4
gpt4 key购买 nike

根据我的理解,下面的程序显然应该打印:

1.0 hello world 42

但是,它无法编译。为什么?

#include <iostream>
#include <string>
using namespace std;

template<class... InitialArgTypes>
void CallWithExtraParameter(void (*funcPtr)(InitialArgTypes..., int), InitialArgTypes... initialArgs)
{
(*funcPtr)(initialArgs..., 42);
}

void Callee(double a, string b, int c)
{
cout << a << " " << b << " " << c << endl;
}

int main()
{
CallWithExtraParameter<double, string>(Callee, 1.0, string("hello world"));
}

Compiler output:

prog.cpp: In function 'int main()':
prog.cpp:18:75: error: no matching function for call to 'CallWithExtraParameter(void (&)(double, std::string, int), double, std::string)'
CallWithExtraParameter<double, string>(Callee, 1.0, string("hello world"));
^
prog.cpp:6:6: note: candidate: template<class ... InitialArgTypes> void CallWithExtraParameter(void (*)(InitialArgTypes ..., int), InitialArgTypes ...)
void CallWithExtraParameter(void (*funcPtr)(InitialArgTypes..., int), InitialArgTypes... initialArgs)
^
prog.cpp:6:6: note: template argument deduction/substitution failed:
prog.cpp:18:75: note: mismatched types 'int' and 'double'
CallWithExtraParameter<double, string>(Callee, 1.0, string("hello world"));
^

最佳答案

首先,"hello world" 不会推导为 std::string,它会推导为 const char*,这不会不匹配 Callee,所以让我们修复您的调用以传递 "hello world"s

其次,参数类型似乎存在一些问题:

void (*funcPtr)(InitialArgTypes..., int)

这显然处于非推导上下文和可推导上下文之间的某种边缘 - 因为它不是非推导上下文(否则 InitialArgTypes... 会从其他参数推导出来)并且它不可推导(因为它仍然失败)。因此,让我们更进一步,明确地使其成为非推导上下文:

template <class T> struct identity { using type = T; };
template <class T> using identity_t = typename identity<T>::type;

template <class... InitialArgTypes>
void CallWithExtraParameter(void (*funcPtr)(identity_t<InitialArgTypes>..., int),
InitialArgTypes... initialArgs)
{
(*funcPtr)(initialArgs..., 42);
}

现在InitialArgTypes... 将从末尾传入的参数推导出来。这就是我们想要的,所以这是可行的:

CallWithExtraParameter(Callee, 1.0, "hello world"s);

关于c++ - 这个程序调用带有参数包的函数指针有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36166915/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com