Что не так с этой частичной специализацией шаблона? - PullRequest
0 голосов
/ 25 декабря 2010
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не допускается

Ответы [ 3 ]

1 голос
/ 25 декабря 2010

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

Нечто подобное

0 голосов
/ 25 декабря 2010

Вы можете попробовать что-то вроде этого ( 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, но можно ли теперь частично специализировать функцию?

0 голосов
/ 25 декабря 2010

Вам нужно распаковать и в этой строке:

bool call_retval_wrapper<bool, Op, Args...>( 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...