类或函数模板"static-if"更好?

"static-if" better with classes or function templates?

本文关键字:更好 static-if 函数模板      更新时间:2023-10-16

我想定义用于序列化变量的接口,其中根据模板参数,执行序列化代码(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);

正如 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)