我想定义用于序列化变量的接口,其中取决于模板参数,执行序列化代码(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);
答案 0 :(得分: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;
};
(代码取自Static interfaces in C++, Brian McNamara and Yannis Smaragdakis)