繁体   English   中英

在模板化类的模板化方法中重载std :: function参数

[英]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()Tvoid

以下是完整的工作示例

#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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM