依赖于模板参数的类型定义

Type definitions dependent on template parameters

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

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

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

只要我只需要 class A 中的 someName,这工作得很好。但是我的项目已经发展壮大,我添加了其他模板化的 classes,它们也应该使用 someName

我的问题是:定义(多个)依赖于某些模板参数的类型并在多个其他 classes 中使用它们的最佳方法是什么(最好不要不断写出所有参数)?

我目前的想法:

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

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

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

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&>);