Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通配符函数指针非类型模板参数_C++_C++11 - Fatal编程技术网

C++ 通配符函数指针非类型模板参数

C++ 通配符函数指针非类型模板参数,c++,c++11,C++,C++11,模板可以接受非类型函数指针参数,但如果接受所有可能的函数指针参数,则会出现问题,例如: void dummy() { } template <typename FT, FT* fp> void proxy() { fp(); } int main() { proxy<decltype(dummy), &dummy>(); return 0; } void dummy() { } 样板 无效代理() { fp(); } int main() {

模板可以接受非类型函数指针参数,但如果接受所有可能的函数指针参数,则会出现问题,例如:

void dummy()
{
}

template <typename FT, FT* fp>
void proxy()
{
  fp();
}

int main()
{
  proxy<decltype(dummy), &dummy>();

  return 0;
}
void dummy()
{
}
样板
无效代理()
{
fp();
}
int main()
{
proxy();
返回0;
}

正如你所看到的,这是非常麻烦的。是否有更方便的方法提供“通配符”函数指针作为非类型模板参数?

针对特定问题的更好解决方案是只将函数类型作为模板参数,将项作为普通函数参数。也可以使用类型推断,而不是显式指定使用哪些参数类型:

void dummy()
{
}

template <typename FT>
void proxy(FT fp)
{
  fp();
}

int main()
{
  proxy(fp);

  return 0;
}
void dummy()
{
}
样板
无效代理(FT fp)
{
fp();
}
int main()
{
代理(fp);
返回0;
}

如果您知道要调用的函数的签名(当然知道),您不能这样做吗

template<void F()>
void proxy()
{
    F();
}

void dummy() {}

int main()
{
    proxy<dummy>();
}
模板
无效代理()
{
F();
}
void dummy(){}
int main()
{
proxy();
}

可能重复@Chowlett no,这是不同的。你提到的问题缩小了人们可以提供的函数指针的种类。@KerrekSB Watson先生,我不能使用函数来做这件事,因为函数参数不能用来实例化进一步的模板。@user1095108:Ah,这是我的一个基本疏忽。对于这个用例,宏可能是一个合理的解决方案。我需要保留函数指针作为模板参数来实例化其他模板。@user1095108,以便从
proxy()
中调用其他模板方法,或者实例化模板类?如果是第一种情况,那么这些调用是否也可以依靠类型推断呢?如果第二个-hmm…@user1158692模板函数被实例化,并且除了
FT
fp
之外,它还知道返回类型和参数类型(因为这些参数是推导出来的)。知道了所有这些,它可以提供正确类型的参数,并从
fp
返回正确的值。我不知道签名。可以使用任何函数指针,没有任何限制。@user1095108请稍候,您必须知道函数签名,才能从
代理
(或任何其他地方)调用函数,因为
代理
(或任何地方)必须提供正确类型的任何参数!?函数的任何一个函数都不会被调用——在这种情况下,请不要为任何函数而烦恼!;-)@user1158692我可以用
FT
fp
实例化模板,然后它可以推断参数类型和返回类型,并在以某种方式调用时将它们提供给
fp
。它可以从任何地方获取参数,一个网络,一个数据库。。。