【问题标题】:Type definitions dependent on template parameters依赖于模板参数的类型定义
【发布时间】:2022-01-14 03:31:42
【问题描述】:

我目前正在使用 C++ 中的模板类。在这些类中,我使用的类型再次依赖于模板参数。为了不一直输入参数,我做了一些类似的事情

template<typename T>
class A
{
    using someName = someClass<T>;
}

实际代码中有更多示例,但这应该能说明这个想法。

这很好用,只要我在 A 类中只需要 someName。但我的项目已经发展壮大,并且我添加了其他应该使用 someName 的模板类。

我的问题是:什么是定义上述(几种)类型的最佳方法,这些类型取决于一些模板参数并在多个其他类中使用它们(最好不用写出所有参数不断)?

到目前为止我的想法:

  1. 当然,我可以简单地将using someName = std::someClass&lt;T&gt;; 复制到所有使用它的类。但这不是很优雅,添加类和添加此类类型都变得越来越麻烦。
  2. 另一种方法是将所有usings 写入文件并让编译器通过include 为我进行复制和粘贴。但我不确定这是否真的有效,这似乎是一种非常暴力的方法,通常不是好的做法。
  3. 我还尝试了涉及using 的不同方法,但到目前为止都没有奏效。不过,在我看来,这可能是解决问题的最有希望的途径。

也许我把事情弄得太复杂了,有一个更简单、更直接的解决方案。

【问题讨论】:

  • 貌似没办法,连继承都不行stackoverflow.com/questions/39334150/…
  • ???矢量 ???您的示例没有向量。不清楚您的用例是什么。是否有一个参数,可能是向量,用作许多其他模板化事物中的预定义别名?
  • 一个 type_traits 类可能对这些 typedef 进行分组,但 std::vector&lt;T&gt; 可能比 typename myTrait&lt;T&gt;::vector 更短/更简单...
  • 您可以创建模板别名,例如someContainerClass&lt;T&gt;,它可能变为vectorlist,具体取决于T。不确定这是否有帮助。你的问题有点不清楚。
  • @Klaus 抱歉,我将示例更改为更通用但忘记调整文本

标签: c++ templates typedef using


【解决方案1】:

创建一个定义每个公共别名的结构:

template<typename T> struct Aliases {
    using value_type = T;
    using reference = T&;
};

...并从中继承:

template<typename T> class Foo: public Aliases<T> {};
template<typename T> class Bar: public Aliases<T> {};
template<typename T> class Baz: public Aliases<T> {};

一些测试:

static_assert(std::same_as<Foo<char>::value_type, char>);
static_assert(std::same_as<Bar<int>::reference, int&>);
static_assert(std::same_as<Baz<int>::reference, int&>);

【讨论】:

  • 非常感谢。我会试试这个。虽然这可能不是继承原本打算用于的 ^^
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
  • 2010-12-17
  • 2018-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多