gpt4 book ai didi

c++ - std::pair 构造函数接口(interface)

转载 作者:IT老高 更新时间:2023-10-28 22:14:44 35 4
gpt4 key购买 nike

其实是一个关于界面设计的普遍问题,不过我还是以std::pair为例比较容易:

template <class T1, class T2>
struct pair {
...
pair(const T1& x, const T2& y);
template<class U, class V> pair(U&& x, V&& y);
...
};

所以我们可以看到有两个重载都需要 2 个参数来初始化对的 2 个成员。我的问题是,在第二个可用时提供第一个有什么好处?是否有任何类型的参数只能传递给第一个而不能传递给第二个?

(让我们暂时搁置标准库对向后兼容性的考虑,将接口(interface)设计作为一个一般性问题来讨论。)

最佳答案

示例实现

template<typename T1, typename T2>
struct simple_pair {
simple_pair (T1 const& v1, T2 const& v2) // (1)
: first (v1)
, second (v2)
{ }

template<class U, class V>
simple_pair (U&& v1, V&& v2) // (2)
: first (std::forward<U> (v1))
, second (std::forward<V> (v2))
{ }

T1 first;
T2 second;
};

尽管提供这两个重载似乎是多余的 (1)(2)在某些情况下,第二个不可用,而第一个不仅是首选,而且实际上是必需的。

假设我们想要构造我们的部分或全部值,同时将它们传递给 simple_pair 的构造函数。 ,如果没有第一次重载,我们将不得不第二次显式指定至少一个类型。

T val;

simple_pair<T, U> p1 { {}, {} }; // only (1) is applicable
simple_pair<T, U> p2 { val, {} }; // only (1) is applicable
simple_pair<T, U> p3 { T {}, U {} }; // can use (1) and (2), but this require a lot of typing

替代实现

如果我们使用下面的方法来实现,我们可以绕过 "superfluous"重载,因为编译器会知道我们想要构造什么类型,以防这些信息是必填。

template<typename T1, typename T2>
struct simple_pair {
template<class U = T1, class V = T2>
simple_pair (U&& v1, V&& v2)
: first (std::forward<U> (v1))
, second (std::forward<V> (v2))
{ }

T1 first;
T2 second;
};

  T val;

simple_pair<T, U> p1 { {}, {} }; // legal
simple_pair<T, U> p2 { val, {} }; // legal
simple_pair<T, U> p3 { T {}, U {} }; // legal

为什么不是 std::pair声明要使用替代实现来实现?

我们只能猜测,但大概是因为向后兼容性以及指定它当前的方式便于库实现者实现1

通过两个单独的重载,可以轻松禁用 template<class U, class V> simple_pair (U&&, V&&)通过使用宏有条件地添加它来重载(以查看我们是否使用 c++11(或更高版本)),而不是有条件地选择退出并添加另一个。


其他潜在原因

  • 从标准中删除一些东西总是一件微妙的事情。遵循 better safe than sorry 成语; “如果不疼,就把它留在里面。” - @PlasmaHH

  • 每个人都知道,你写的代码行数越多,你的程序员就越好……你的程序员就越好;你得到的报酬越多。


1. 当然不是很多,但见鬼.. 有点迂腐也没有什么坏处.. ;-)

关于c++ - std::pair 构造函数接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22165618/

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