[英]Overloading a std::function parameter in templated method in templated class
我在为类模板专门化中的模板化方法制作专门的模板时遇到麻烦。
假设我有以下代码:
#include <functional>
template<typename T>
class myClass {
public:
T bar() {
return T();
}
template<typename P>
bool foo(std::function<P(T)> g) {
g(bar());
return true;
}
};
如果我想专用于myClass<void>
的功能bar
,我可以这样做:
template<> void myClass<void>::bar() {
}
但是,当我尝试以相同的方式专门化foo
时,出现编译器错误,提示error: invalid parameter type 'void'
并指向foo的原始定义。
template<>
template<typename P>
bool myClass<void>::foo(std::function<P(void)> g) {
bar();
g();
return true;
}
有人有任何建议吗,我做错了什么?
不完全专业化...您可以使用SFINAE( std::enable_if
)来激活您的版本foo()
时, T
不是void
和激活的另一个版本foo()
时T
是void
。
以下是完整的工作示例
#include <iostream>
#include <functional>
template <typename T>
class myClass
{
public:
T bar()
{ return {}; }
template <typename P, typename U = T>
typename std::enable_if<false == std::is_same<U, void>::value,
bool>::type foo (std::function<P(U)> const & g)
{ g(bar()); return true; }
template <typename P, typename U = T>
typename std::enable_if<true == std::is_same<U, void>::value,
bool>::type foo (std::function<P()> const & g)
{ bar(); g(); return false; }
};
template<>
void myClass<void>::bar ()
{ }
int main()
{
myClass<int> mci;
myClass<void> mcv;
std::function<long(int)> fli { [](int i){ return long(i); } };
std::function<short()> fsv { [](){ return 0; } };
std::cout << mci.foo(fli) << std::endl; // print 1
std::cout << mcv.foo(fsv) << std::endl; // print 0
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.