函数指针中的参数太多,太少 我试图从基础知识中学习C++,我在玩函数指针。考虑到这一准则: #include <iostream> #include <string> #include <vector> bool print(std::string); bool print(std::string a) { std::cout << a << std::endl; return true; } bool call_user_function(bool(std::string), std::vector<std::string>); bool call_user_function(bool(*p)(std::string), std::vector<std::string> args) { if (args.size() == 0) return (*p)(); (*) else if (args.size() == 1) return (*p)(args[0]); else if (args.size() == 2) return (*p)(args[0], args[1]); (**) } int main(int argc, char** argv) { std::vector<std::string> a; a[0] = "test"; call_user_function(print, a); // ok return 0; } #包括 #包括 #包括 bool打印(std::string); bool打印(标准::字符串a) { std::cout

函数指针中的参数太多,太少 我试图从基础知识中学习C++,我在玩函数指针。考虑到这一准则: #include <iostream> #include <string> #include <vector> bool print(std::string); bool print(std::string a) { std::cout << a << std::endl; return true; } bool call_user_function(bool(std::string), std::vector<std::string>); bool call_user_function(bool(*p)(std::string), std::vector<std::string> args) { if (args.size() == 0) return (*p)(); (*) else if (args.size() == 1) return (*p)(args[0]); else if (args.size() == 2) return (*p)(args[0], args[1]); (**) } int main(int argc, char** argv) { std::vector<std::string> a; a[0] = "test"; call_user_function(print, a); // ok return 0; } #包括 #包括 #包括 bool打印(std::string); bool打印(标准::字符串a) { std::cout,c++,function-pointers,C++,Function Pointers,p的类型为bool(*)(std::string)。这意味着它是指向一个函数的指针,该函数有一个std::string类型的参数,并返回一个bool p可以指向print,因为print的类型匹配:它是一个函数,具有类型为std::string的单个参数,并返回bool 您的第一个错误表达式,(*p)()尝试在没有参数的情况下调用p。您的第二个错误表达式,(*p)(args[0],args[1])尝试使用两个参数调用p 参数的数量必须与参数的数量相匹配,因此这两个参数的格式都不正确,就像试图直接

p
的类型为
bool(*)(std::string)
。这意味着它是指向一个函数的指针,该函数有一个
std::string
类型的参数,并返回一个
bool

p
可以指向
print
,因为
print
的类型匹配:它是一个函数,具有类型为
std::string
的单个参数,并返回
bool

您的第一个错误表达式,
(*p)(
)尝试在没有参数的情况下调用
p
。您的第二个错误表达式,
(*p)(args[0],args[1])
尝试使用两个参数调用
p


参数的数量必须与参数的数量相匹配,因此这两个参数的格式都不正确,就像试图直接调用
print
而不使用参数或使用两个参数会导致编译错误一样。

p
的类型为
bool(*)(std::string)
。这意味着它是指向一个函数的指针,该函数有一个类型为
std::string
的参数,并返回一个
bool

p
可以指向
print
,因为
print
的类型匹配:它是一个函数,具有类型为
std::string
的单个参数,并返回
bool

您的第一个错误表达式,
(*p)(
)尝试在没有参数的情况下调用
p
。您的第二个错误表达式,
(*p)(args[0],args[1])
尝试使用两个参数调用
p


参数的数量必须与参数的数量相匹配,因此这两个参数的格式都不正确,就像试图直接调用没有参数或有两个参数的
print
会导致编译错误一样。

print
对于没有参数的调用没有重载


print
对于两个
std::string
参数也没有重载。

print
对于没有参数的调用没有重载


print
对于两个
std::string
参数也没有重载。

@JamesMcNellis已经解决了代码的问题

要使类似的工作正常进行,您可能需要执行以下操作:

bool call_user_function(bool(*p)(std::string), std::vector<std::string> args) {
    bool ret = true;
    for (int i=0; i<args.size(); i++)
         ret &= p(args[i]);
    return ret;
}
bool调用用户函数(bool(*p)(std::string),std::vector args){
bool-ret=真;

对于(inti=0;i@JamesMcNellis已经解决了代码的问题

要使类似的工作正常进行,您可能需要执行以下操作:

bool call_user_function(bool(*p)(std::string), std::vector<std::string> args) {
    bool ret = true;
    for (int i=0; i<args.size(); i++)
         ret &= p(args[i]);
    return ret;
}
bool调用用户函数(bool(*p)(std::string),std::vector args){
bool-ret=真;

对于(int i=0;没错。我真傻。有没有办法让它成为一个返回bool但可以有多个参数的指针?这取决于你想做什么:
print
只接受一个参数。打印多个参数意味着什么;你希望它的行为是什么?一个选项是
call\u user\u function
将user函数应用于每个参数:为每个参数调用user函数一次。我想模拟
call\u user\u function
的PHP行为,它可以调用任何函数并向其传递任何参数。因此我想能够创建我的
call\u user\u function()可以调用返回BoL的函数,并且具有<代码> STD::String 作为参数(并且可以通过向量传递)。向后退一步,考虑一下:你想完成什么?你在问你“我正在尝试从基础上学习C++”。这不是通常在C++中完成的事情:通常不需要使用运行时提供的任意参数集动态调用任意函数。是否有您正试图解决的特定问题?如果是,可能有更好的解决方案来解决该特定问题。是的,您可能是对的。正如我所说,我只是到处闲逛。谢谢你的帮助。哦,对了。我真傻。有没有办法让它成为一个返回布尔值但可以有多个参数的指针?这取决于你想做什么:
print
只接受一个参数。打印多个参数意味着什么;你希望它的行为是什么?一个选项将让您的
call\u user\u函数
将user函数应用于每个参数:为每个参数调用user函数一次。我想模拟
call\u user\u函数
的PHP行为,它可以调用任何函数并向其传递任何参数。因此,我希望能够创建我的
call\u user\u funcType()/Cuth>可以调用任何函数返回BoOL,并具有<代码> STD::String 作为参数(并且可以通过向量传递)。退一步考虑一下:这是一个好主意:你想完成什么?你在你的问题中说“我正在尝试从基础知识中学习C++”。这不是通常在C++中完成的事情:通常不需要使用运行时提供的任意参数集动态调用任意函数。是否有您正试图解决的特定问题?如果是,可能有更好的解决方案来解决该特定问题。是的,您可能是对的。正如我所说,我只是四处游荡。谢谢你的帮助。
a[0]=“test”
是错误的,因为向量不包含元素。如果它至少包含一个元素,那就行了。尽管不相关,但定义前面的函数声明却一事无成。@GManNickG,哦,我应该使用
push_back()
?@JerryCoffin,你不是被迫为电动汽车定义一个原型吗
std::copy(a.begin(), a.end(), 
          std::ostream_iterator<std::string>(std::cout, "\n"));