2

trueテンプレートの引数に応じて、シリアル化コード( )または何も実行されない()変数をシリアル化するためのインターフェイスを定義したいと思いますfalse。シリアル化関数自体は、アーカイブ型と変数型でテンプレート化されています。

シリアル化関数を部分的に特殊化するのが良いですか、それとも内部に静的メソッドを持つクラスを特殊化するのが良いですか?以下のコードは正しいですか?もっと良い方法はありますか?


これは私の疑似コードであり、機能するかどうかはわかりません。

クラスアプローチは次のようになります。

template<bool ser>
struct MaybeSerialize;

template<> struct MaybeSerialize<true>{
   template<class ArchiveT, class T>
   static void serialize(ArchiveT& archive, T& var){ /* serialize*/ }
};

template<> struct MaybeSerialize<false>{
   template<class ArchiveT, class T>
   static void serialize(ArchiveT& archive, T& var){ /* do nothing*/ }
};

// call like this
MaybeSerialize<compileTimeBool>::serialize(archive,variable);

部分的な特殊化は次のようになります(構文はおそらく間違っています):

template<bool ser, class Archive T, typename T> maybeSerialize(ArchiveT&,T&);
template<class ArchiveT, typename T> maybeSerialize<true>(ArchiveT&,T&){ /* serialize */ }
template<class ArchiveT, typename T> maybeSerialize<false>(ArchiveT&,T&){ /* do nothing */ }
// call like this
maybeSerialize<compileTimeBool>(archive,variable);
4

1 に答える 1

3

Pubbyがすでにコメントしているように、C ++でテンプレート関数を部分的に特殊化することは不可能であるため、クラスの特殊化を使用する必要があります。それにもかかわらず、C++での実装が非常に単純な場合は静的です。

/**
 * Usual meta-IF
 * Chooses between two template parameters dependent on a given static
 * boolean value.
 *
 *  @tparam b The static boolean value to check
 *  @tparam T The class chosen when b yields true
 *  @tparam E The class chosen when b yields false
 */
template <bool b, class T, class E>
struct IF;

/**
 * Specialization for IF<true,T,E>. Chooses T for typedef RET.
 */
template <class T, class E>
struct IF<true,T,E> {
   typedef T RET;
};

/**
 * Specialization for IF<false,T,E>. Chooses E for typedef RET.
 */
template <class T, class E>
struct IF<false,T,E> {
   typedef E RET;
};

C ++、Brian McNamara、Yannis Smaragdakisの静的インターフェイスから取得したコード)

于 2012-05-28T16:34:15.563 に答える