通过显式构造函数初始化数组
Initializing array through explicit constructor
我正在写一个具有const char*
参数的显式构造函数的类。出于这个问题的目的和目的,它看起来像这样:
struct Symbol
{
Symbol()=default;
explicit Symbol(const char*);
};
现在,我想编写一个用于文档目的的示例,该示例初始化了一个数组(数组/向量/列表 - 我不在乎确切的类型(,我需要一个示例才能尽可能清楚和简洁。理想情况下,它看起来像这样:
Symbol symbols[] = { "a", "b", "c"};
由于明确的关键字而没有编译,我不准备使构造函数隐含。
如何使这项工作,重点是使示例代码尽可能表达?
编辑:我在卡利斯(Caleth(的一点帮助下去了博洛夫(Bolov(的解决方案:
struct Symbol
{
Symbol();
explicit Symbol(const char*);
template <class... Args>
static std::array<Symbol, sizeof...(Args)> Array(Args... args)
{
return {Symbol{args}...};
}
};
int main()
{
auto symbols = Symbol::Array("a", "b", "c");
}
好吧,您的构造函数是明确的,因此您需要这样使用:
Symbol symbols[] = {Symbol{"a"}, Symbol{"b"}, Symbol{"c"}};
gcc和clang既副本/移动构造函数又是C 17,这是所需的行为,因此没有性能开销。
如果您真的想保留构造函数explicit
并能够在不明确说明每个元素的情况下创建一个数组,则可以创建一个辅助函数:
template <class... Args,
class Enable = std::enable_if_t<(... && std::is_same_v<Args, const char*>)>>
auto make_symbols(Args... args) -> std::array<Symbol, sizeof...(Args)>
{
return {Symbol{args}...};
}
并这样使用:
auto symbols = make_symbols("a", "b", "c");
再次省略了移动/副本。
make_symbols
函数使用C 17功能来检查参数类型。如果您需要对先前标准版本的约束(包括C 11(,请参见此答案限制Variadic模板参数。或者,根据您的需求,删除支票也可以是一种选择。
到目前为止我想出的最好的是:
std::vector<Symbol> symbols;
for(auto v: { "a", "b", "c"})
symbols.emplace_back(v);
相关文章:
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 在函数内部的声明中初始化数组,并在外部使用它
- 为什么用结构初始化数组需要指定结构名称
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- C++使用另一个数组和新值初始化数组
- 初始化数组、"memset"或" {//value} "的最佳方法是什么?
- 在 constexpr 构造函数中初始化数组是否合法?
- 我可以初始化 const 实例,以便我可以将其用作 const 来初始化数组吗?
- 在构造函数中初始化数组
- 是否可以使用函数返回的值初始化数组
- 使用宏使用额外元素初始化数组
- 在循环中显示不同值的初始化数组
- 如何在macOS中的旧扩展clang和gcc编译器中初始化数组和向量
- 使用可变模板列表初始化数组,并放置new
- 使用函数从 Visual Studio 2017 中的 main 创建和初始化数组
- 使用 c++ 中的函数初始化数组
- 这是使用构造函数初始化数组对象的最佳方法吗?
- C++ 使用变量而不是常量表达式初始化数组
- 在初始化列表中初始化数组的更好方法
- 在可变参数模板类中初始化数组