gpt4 book ai didi

c++ - C++ 中的可扩展类型特征

转载 作者:IT老高 更新时间:2023-10-28 23:21:56 25 4
gpt4 key购买 nike

我想编写一个通用序列化库,它提供例如一个通用的 save 函数。该库包含自定义类型特征,例如some_condition:

template <typename T>
struct some_condition
{
constexpr static bool value = std::is_same<std::string, T>::value ||std::is_arithmetic<T>::value ;
};

save 的行为是根据 some_condition 选择的:

template <typename T>
std::enable_if_t<some_condition<T>::value> save(const T& value)
{
std::cout << "these types will be handled in a specific way: " << value << std::endl;
}

template <typename T>
std::enable_if_t<!some_condition<T>::value> save(const T& value)
{
std::cout << "these types will be handled in another way: " << value << std::endl;
}

save 应为用户数据类型定制,不仅通过重载,而且通常通过特征。因此我创建了 trait_extension 可以专门用于特征模板:

template <template<typename> class Trait, typename T>
struct trait_extension : Trait<T>
{
}

save 必须相应修改:

template <typename T>
std::enable_if_t<trait_extension<some_condition,T>::value> save(const T& value) { ... }


template <typename T>
std::enable_if_t<!trait_extension<some_condition,T>::value> save(const T& value) { ... }

用户现在可以提供他自己的 trait_extension 特化:

template <typename T>
struct trait_extension<some_condition, T>
{
// user specific extension: exclude floats from condition
constexpr static bool value = !std::is_floating_point<T>::value && some_condition<T>::value;
};

我的问题::

有没有“更好”/更优雅的方式来实现可扩展的特征?

live example

最佳答案

我认为你的方法一点也不优雅。它很容易变成意大利面条代码,并且难以维护或使用。我会改为采用基于“策略”的方法,类似于标准库中的 std::allocator 类。改变行为是实现分配器接口(interface)并将其作为模板参数提供的简单问题。然后一切都会自动运行。

一方面,在“通用序列化”库中,您不仅需要担心类型,还需要担心本地化。它可以像使用 , 而不是 . 一样简单,也可以像统一大写一样复杂。使用您的方法,修改流或语言环境(即 std vs boost)后端并不是很容易,但使用基于策略的方法,这是一个搜索和替换的问题:

serialize<int, std_locale<int>>(32.000)
serialize<int, boost_locale<int>>(32.000)

这允许您在主语言环境类 ala std::allocator 中提供一组“默认值”,然后用户可以从中继承并更改一种或两种类型的行为,而不是提供疯狂的 SFINAE 重载。

关于c++ - C++ 中的可扩展类型特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37273285/

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