【问题标题】:C++ 17 class template argument type deduction - readability [closed]C ++ 17类模板参数类型推导 - 可读性[关闭]
【发布时间】:2018-02-14 18:59:54
【问题描述】:

对于支持此功能的编译器,您可以编写

std::tuple t1(1);

但在我看来,在这种情况下,该程序的可读性受到了损害。

例如,如果您有自己的类,其行为类似于 std::tuple,读者不会看到此模板类的不同实例可能具有不同的类型

Myple t1(1);
Myple t2(1, 2);
Myple t3(1, 3);
...
t1 == t2; // compiler error, t1 and t2 are actually of different types
t2 == t3; // no error

有什么建议可以解决这个“可读性”问题吗?

我的建议是让程序员写这样的东西

Myple<auto...> t1(1);

(甚至Myple<...> t1(1); )

所以程序读者至少会知道,因为他们知道 2 个不同的汽车可以是不同的类型。

但我相信还有更智能的解决方案。

编辑

将“用户体验”更改为“可读性”。

【问题讨论】:

  • @StoryTeller:你仍然需要阅读其他人的代码。我不同意他认为这是糟糕的“用户体验”的观点,但是当你必须与喜欢的人打交道时,你不能只说“不喜欢,不要使用”喜欢。
  • @NicolBolas - 我不记得曾经参与过没有一些风格指南的项目。如果这对 OP 意义重大,他们应该说出来。无论如何,他们在这里提出的任何建议都不会使已经以这种方式编写的代码自己改写。
  • 如果你以auto varname = ...; 形式编写变量声明,这不是什么大问题,因为如果你眯着眼睛,auto varname = std::tuple{1, 2}; 看起来像auto varname = std::make_tuple(1, 2);
  • 我真的不明白能够写 Myple t1(1); 的具体内容是什么。任何auto 都不一样吗?如果您在代码中看到auto x = foo();auto y = bar();,那么您要么知道xy 是什么类型,要么编译器会在您尝试x= y; 时告诉您最新的信息
  • 顺便说一句,该评论确实是一个问题(并非旨在暗示您的问题没有实际意义)。我猜你担心当程序员看到像T x; T y;这样的声明时,他们习惯于拥有相同类型的变量@

标签: c++ templates type-deduction c++17


【解决方案1】:

有什么建议可以解决这个“用户体验”问题吗?

在撰写本文时,已有no proposal written suggesting that this be changed。 C ++ 17 完成,完成,出门在外。因此,任何删除此功能的此类提议都将与 C++17 向后不兼容。

因此,此类提议需要证明自己的合理性,而不仅仅是将其称为“'用户体验'问题”。

earliest revisions of the class template deduction proposal 中可以清楚地看出,目标 是创建您认为不好的 UX,以允许像函数模板参数一样“精确”推导出类模板参数。即使是"challenges" with the proposal were addressed,似乎也没有任何建议需要模板名称之外的显式语法来调用类模板参数推导。

简而言之,提案的目标是allow constructors to "deduce their template parameters 'like we expect from other functions and methods,'"

因此,不仅没有解决这个“'用户体验'问题”的建议;而且正是这个“'用户体验'问题”是这个想法的重点

【讨论】:

  • 这个想法的重点是不必枚举模板参数。但我认为它产生了一个不同的(可读性)问题,当 2 个变量看起来它们具有相同的类型而实际上它们没有。这就是为什么我更喜欢看 Myple。它会告诉我,我在这里看到的类型不是它看起来的样子。
  • 我意识到你不能恢复 C++17 标准,因为它已经过时了。但是添加一个新的方式来使用这个功能也不是不可能的。
  • @Alek86:“这个想法的目的是让枚举模板参数变得不必要。”我给了你一个直接引用来自关于“想法的重点是什么”的建议。你可能有不同的想法,但不是那些真正提出这个建议并将其标准化的人。 “添加一个新的方式来使用这个特性并不是不可能的。”这将改变没有关于使用它的旧方式的代码,所以你觉得用户体验“问题”存在将仍然存在。 C++ 不需要更多的方法来做同样的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-25
  • 2020-07-09
  • 1970-01-01
  • 2011-10-07
  • 2017-12-30
  • 1970-01-01
相关资源
最近更新 更多