gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:53:42 26 4
gpt4 key购买 nike

我想定义用于序列化变量的接口(interface),其中根据模板参数执行序列化代码 (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++ 中部分特化模板函数,您必须使用类特化。尽管如此,静态 if 在 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;
};

(代码取自 Static interfaces in C++, Brian McNamara and Yannis Smaragdakis )

关于c++ - "static-if"类或函数模板更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10786593/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com