基础类模板参数的有意义名称
Meaningful names for base class template arguments
中的命名基类非类型参数的最佳方法是什么
class Derived : public Base<Argument> {
...
}
如果我能做到这一点,那将是很棒的:
class Derived : public Base<Argument> {
constexpr static int Argument = 1;
...
}
,但在派生的课程声明期间尚未定义参数。
我可以使用#define,但是我也想将此名称嵌入一个名称空间。
可以解释以下讨论,即标准做法是
template<int N>
class Base {
protected:
static const int n = N;
...
};
并在需要此值的任何地方使用" n"作为有意义的名称。
使用派生类中基类的模板参数
但是,该值本身在派生类声明中看起来已加密:
class Derived : public Base<whatever value>
此方法是最佳选择吗?
编辑:我的动机是为其他开发人员提供促进对此论点的修改。他们更容易修改
中的" buffersize = 1024"行class MyScreen : public ScreenBase<BufferSize> {
... BufferSize = 1024;
而不是
class MyScreen : public ScreenBase<1024> {
这是用虚构名称的很难推理,但是,如果我正确理解您,您想拥有模板参数的名称(例如,快速搜索它们(。
我认为这不是一个大问题,您总是可以搜索每次Base<T>
用作基类(即使是public Base<
的普通幼稚的grep
也可以。而且您不能删除模板以支持A 属性或ctor参数,然后您只需要为您的值引入一个命名的容器:
#include <type_traits>
#include <cstddef>
template<std::size_t V>
struct buffer_size : public std::integral_constant<std::size_t, V> {};
现在您的课程声明将是:
template<typename S>
struct buffered_stream<S> {
static constexpr std::size_t size = S::value;
};
现在,当您使用它时,您可以清楚地了解该参数是什么:
struct network_stream : public buffered_stream<buffer_size<1024>> {
// ...
};
请注意,这是受模板实例化方法的启发,例如,您可以在std::chrono::duration
中看到。出于同样的原因,您还应考虑使用用户定义的后缀(当它们足够清晰时(。例如,这在许多情况下可能就足够了:
struct network_stream : public buffered_stream<1024_bytes> {
// ...
};
请将此代码视为起点,当然,您想使用std::is_same()
来产生一些不错的编译器诊断(尤其是如果您有一个以上命名参数(。仅此一项就可以使您的代码比此概念证明更加复杂,但我想您现在了解如何做。
相关文章:
- 在C++中,使用带有 std::optional 参数的函数<T>来表示可选参数是否有意义?
- API 返回智能指针的 std::optional 以明确指定指针可能为 null 是否有意义?
- 从头开始为应用程序创建 docker 映像是否有意义?
- 在c++中,如果首先禁止默认构造,那么禁止复制构造有意义吗
- sizeof(函数)有意义吗?
- 二进制模式 + 格式化文本操作或文本模式 + 二进制数据操作 - 有意义吗?
- 我能知道我的函数有多少参数吗?
- 插入向量时,使用lambda的返回而不是函数的返回是否有意义?
- 在 C++17 中使用 const std::string& 参数有意义吗?
- 基础类模板参数的有意义名称
- 内联这个函数,确实有意义
- 将 final 关键字添加到没有基类(未派生)的类中的虚函数是否有意义
- 为什么XMMatrixInverse()有行列式参数?
- 为什么可变参数宏在“)”标记之前出现预期的主表达式失败,除非前面有命名参数
- 左移负整数为零是否有意义?
- 是否有一个上下文表达式`a.b :: c`有意义
- 是否有一些有意义的统计数据来证明保持有符号整数算术溢出未定义是合理的
- 将可选与reference_wrapper相结合是否有意义?
- 具有多个非可选参数的转换构造函数是什么样子的?为什么它有意义
- C++ 指针参数:创建指向的值的副本,然后再次将副本存储为指针是否有意义