这个部分模板专业化有什么问题?

时间:2010-12-25 12:29:13

标签: c++ c++11 template-specialization

template<typename Retval, typename Op, typename... Args>
Retval call_retval_wrapper(CallContext &callctx, Op const op, Args &...args);

template<typename Op, typename ...Args>
bool call_retval_wrapper<bool, Op, Args>(
        CallContext &callctx, Op const op, Args &...args) {
    (callctx.*op)(args...);
    return true;
}

稍后在代码中调用它:

call_retval_wrapper<bool>(callctx, op, args...)

给出了这个错误:

  

src / cpfs / entry.cpp:1908:错误:   功能模板部分   专业化   'call_retval_wrapper&lt; bool,Op,Args&gt;'   不允许

3 个答案:

答案 0 :(得分:1)

在C ++中,您不能对函数执行部分模板特化,仅适用于结构和类。所以你应该做完全专业化或使用带有静态成员函数的类(当然这与函数不同)

你可以使用一些技巧:

template<typename Retval, typename Op, typename... Args>
struct my_traits {
 static Retval call_retval_wrapper(CallContext &callctx, Op const op, Args &...args);
};

 template<typename Op, typename ...Args>
 struct my_traits<bool,Op,Args...> {
   static bool call_retval_wrapper<bool, Op, Args>(
    CallContext &callctx, Op const op, Args &...args) {
      (callctx.*op)(args...);
     return true;
   }
 };

template<typename Retval, typename Op, typename... Args>
Retval call_retval_wrapper(CallContext &callctx, Op const op, Args &...args)
{
     return my_traits<Retval,Op,Args...>::call_retval_wrapper(calllxtx,op,args...);
}

像这样的东西

答案 1 :(得分:0)

你也需要在这行中解压缩:

bool call_retval_wrapper<bool, Op, Args...>( 

答案 2 :(得分:0)

您可以尝试这样的事情(ideone):

template<typename Retval, typename Op, typename... Args>
struct call{
  static Retval retval_wrapper(Op const op, Args &&...args);
};

template<typename Op, typename ...Args>
struct call<bool, Op, Args...>{
  static bool retval_wrapper(Op const op, Args &&...args){
    return true;
  }
};

int main(){
  call<bool, bool, bool>::retval_wrapper(true, true);
}

我没有阅读完整的C ++ 0x规范,但是现在可以部分特化功能吗?