这种部分模板特化有什么问题吗?

发布于 2024-10-09 07:25:10 字数 639 浏览 1 评论 0原文

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' 不允许的

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;
}

Calling this later in the code:

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

Gives this error:

src/cpfs/entry.cpp:1908: error:
function template partial
specialization
‘call_retval_wrapper<bool, Op, Args>’
is not allowed

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

‘画卷フ 2024-10-16 07:25:10

在 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...);
}

类似的东西

In C++ you can't do partial template specialization for functions, only for structures and classes. So you should either to do full specialization or use classes with static member functions (of course this is not same as functions)

You may use some tricks using classes:

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...);
}

Something like that

七色彩虹 2024-10-16 07:25:10

您还需要在这一行中解压:

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

You need to unpack in this line too:

bool call_retval_wrapper<bool, Op, Args...>( 
后知后觉 2024-10-16 07:25:10

你可以尝试这样的事情(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规范,但现在可以部分特化函数吗?

You can try something like this (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);
}

I didn't read the full C++0x spec, but is it possible to partial specialize function now?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文