gpt4 book ai didi

c++ - 我怎样才能创建一个行为与另一种类型一样的类型?

转载 作者:行者123 更新时间:2023-11-28 05:24:03 25 4
gpt4 key购买 nike

这个问题的动机是 preferred mechanism to attach a type to a scalar? ,但是这与度量单位有点偏离轨道......

假设我想创建一个 Float这几乎就像float (这不一定是激进的,在 C# 中,System.Floatfloat 几乎完全相同;唯一的区别是一个是类型名称,另一个是关键字)。

您可能会从非常简单的 struct Float final { float v; }; 开始.然后可能会添加一堆 operator过载

inline auto operator+(Float lhs, Float rhs) {
return Float { lhs.v + rhs.v };
}
// ... and so on ...
inline bool operator<(Float lhs, Float rhs) {
return lhs.v < rhs.v;
}
// ... etc. ...

现在,我需要能够转换 FloatDouble

struct Double final { double v; };  
struct Float final { float v;
operator Double() const { return Double { v }; }
};

现在也许我添加operator&()这样我就可以更轻松地与遗留代码进行交互

extern void foo(const float*);
const Float f { 3.14 };
foo(&f);

而不是写foo(&f.v) .

list 还在继续……然后,我意识到这段代码对于 Float 是相同的和 Double ,所以我使用模板:

template<typename T>
struct Type final { T v; }
using Float = Type<float>;
using Double = Type<double>;

但现在我意识到 Tfloat 一样复制可能并不便宜,所以我必须改变我的重载

template<typename T>
inline auto make_Type(T&& v) {
return Type<T> { std::forward<T>(v); }
}

template<typename T1, typename T2>
inline auto operator+(const Type<T1>& lhs, const Type<T2>& rhs) {
return make_Type(lhs.v + rhs.v);
}

任意 T 都有更多的复杂性;例如,它可能是可移动的,但不可复制。

是否有一种“规范”的方式来做这样的事情?还是它真的开始变得(非常)困惑?限制T有帮助吗某种程度上来说? (我真的只需要 doubleint 等,而不是 std::stringstd::vector<T> )。也许有人已经让它适用于(几乎?)所有方面?

请记住,最终我真的想要

template<typename T, typename Tag>
struct TaggedType final
{
typedef Tag tag_type;
typedef T value_type;
value_type value;
};

但不处理 Tag似乎是一个很好的简化(并避免了单位的兔子洞)。

最佳答案

您正在寻找的库最近出现在“标准 C++”网站上。

参见 Tutorial: Emulating strong/opaque typedefs in C++

关于c++ - 我怎样才能创建一个行为与另一种类型一样的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40913400/

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