不允许void的部分函数专门化-替代解决方案
C++: partial function specialization for void not allowed - alternative solution?
我想我现在明白了为什么部分函数模板被认为是混乱和不必要的,因此不被c++标准所允许。不过,我希望能得到一些帮助,重新表述下面的函数,而不是部分专门化。一般情况下,该函数是非特化类的成员:
template <typename IMPL, typename RET>
RET call (functor <IMPL> func,
IMPL * impl)
{
return func.call (impl);
}
template <typename IMPL>
void call <IMPL, void_t> (functor <IMPL> func,
IMPL * impl)
{
func.call (impl);
}
这里的问题是我不能重载函数的返回类型。而且,我想要专门化的typename没有用作函数参数——重载不起作用的另一个原因。是的,我可以引入一个虚拟参数来强制重载,但这很难看,不是吗?
最后,为什么'void'不是c++中的类型?这将使事情更加一致……
我相信,首先,如果你有一个返回void的函数,那么return
一个void表达式是完全合法的-例如调用另一个返回void的函数,其次,void
在c++中是一个完整的类型,你可以把它传递给模板,只要你喜欢。
首先,
template <typename IMPL, typename RET>
RET call (functor <IMPL> func,
IMPL * impl)
{
return func.call (impl);
}
应该是
template <typename RET, typename IMPL>
RET call (functor <IMPL> func,
IMPL * impl)
{
return func.call (impl);
}
(我在模板参数列表中反转了RET
和IMPL
)以便您可以像
call<int>(f, impl);
而不是输入
call<impl_type, int>(f, impl);
实际上,编译器不能推导出RET
,所以你必须自己提供它。
第二,您不需要为void
重载,因为返回void
表达式是可以的。如果你愿意,你可以添加重载:
template <typename IMPL>
void call(functor<IMPL> func, IMPL* impl)
并在调用此重载时使用call(f, impl)
如果您可以访问c++ 0x,请考虑使用decltype
如果您的functor
模板类已经有了RET的typedef,您可以这样做:
template <typename IMPL>
typename functor<IMPL>::RET call (functor <IMPL> func,
IMPL * impl)
{
return func.call (impl);
}
而不考虑重载。另外,你使用的编译器是什么?所有符合标准的编译器都允许从void
函数返回void
函数的结果。
函数部分专门化的一般解决方案包括使用具有相同模板参数的helper类模板,以及具有与函数相同参数的单个方法。然后可以对模板类进行部分特化。
在您的情况下,然而,我认为您应该能够使用void
作为您的返回类型,如其他答案所述。
可以使用function重载:
template <typename IMPL, typename RET>
RET call (functor <IMPL> func,
IMPL * impl)
{
return func.call (impl);
}
template <typename IMPL>
void call (functor <void_t> func, void_t * impl)
{
func.call (impl);
}
另外,void
是c++中的类型;你凭什么认为不是?
- 运行同一解决方案的另一个项目的项目
- Project Euler问题4的错误解决方案
- 计算每个节点的树高,帮助我解释这个代码解决方案
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- visual c++,如何获取解决方案目录中的代码
- 有没有办法在远程设备上打开和编辑visual Studio 2017解决方案
- C++Matching Brackets 2解决方案不起作用
- 在 ubuntu3 上C++ goto 定义有什么解决方案吗16.04?
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的固定时间步长与增量时间和插值的解决方案是错误的吗?
- 无法在问题解决方案中执行输出逻辑
- 最大的回文产品 - 程序未运行,编写解决方案但无法理解问题
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- 在一个解决方案中针对第三方静态库 (Creo) 的不同版本(版本)进行构建
- 如何巧妙地编写两个函数——一个用于检查是否存在解决方案,另一个用于获取所有解决方案
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- N-queen问题:无法弄清楚为什么我的解决方案不起作用
- 从排序数组中删除重复项,具有不同代码方式的相同解决方案具有不同的输出
- 使用XOR查找O(n)-解决方案中的两个字符串是否为变位符
- 不允许void的部分函数专门化-替代解决方案