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++ 中的静态 if 实现非常简单:

/**
 * 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 回答