依赖于模板参数的类型定义
Type definitions dependent on template parameters
我目前正在使用 C++ 中的模板 classes。在这些 classes 中,我使用的类型再次依赖于模板参数。为了不一直输入参数,我做了一些类似
的事情
template<typename T>
class A
{
using someName = someClass<T>;
}
实际代码中还有更多示例,但这应该可以说明这个想法。
只要我只需要 class A
中的 someName
,这工作得很好。但是我的项目已经发展壮大,我添加了其他模板化的 classes,它们也应该使用 someName
。
我的问题是:定义(多个)依赖于某些模板参数的类型并在多个其他 classes 中使用它们的最佳方法是什么(最好不要不断写出所有参数)?
我目前的想法:
- 当然,我可以简单地将
using someName = std::someClass<T>;
复制到所有使用它的classes。但这不是很优雅,添加 classes 和添加此类类型变得越来越麻烦。
- 另一种方法是将所有
using
写入一个文件,然后让编译器通过 include
为我进行复制和粘贴。但我不确定这是否真的有效,而且这似乎是一种非常蛮力的方法,通常不是很好的做法。
- 我还尝试了涉及
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&>);
我目前正在使用 C++ 中的模板 classes。在这些 classes 中,我使用的类型再次依赖于模板参数。为了不一直输入参数,我做了一些类似
的事情template<typename T>
class A
{
using someName = someClass<T>;
}
实际代码中还有更多示例,但这应该可以说明这个想法。
只要我只需要 class A
中的 someName
,这工作得很好。但是我的项目已经发展壮大,我添加了其他模板化的 classes,它们也应该使用 someName
。
我的问题是:定义(多个)依赖于某些模板参数的类型并在多个其他 classes 中使用它们的最佳方法是什么(最好不要不断写出所有参数)?
我目前的想法:
- 当然,我可以简单地将
using someName = std::someClass<T>;
复制到所有使用它的classes。但这不是很优雅,添加 classes 和添加此类类型变得越来越麻烦。 - 另一种方法是将所有
using
写入一个文件,然后让编译器通过include
为我进行复制和粘贴。但我不确定这是否真的有效,而且这似乎是一种非常蛮力的方法,通常不是很好的做法。 - 我还尝试了涉及
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&>);