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<bool, Op, Args>' は許可されていません

4

3 に答える 3

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

そんな感じ

于 2010-12-25T16:32:55.763 に答える
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仕様を読んでいませんでしたが、関数を部分的に特殊化することは可能ですか?

于 2010-12-25T13:12:14.287 に答える
0

次の行でも展開する必要があります。

bool call_retval_wrapper<bool, Op, Args...>( 
于 2010-12-25T12:35:37.390 に答える