【问题标题】:Append items to std::initializer_list at compile time在编译时将项目附加到 std::initializer_list
【发布时间】:2021-06-04 03:25:06
【问题描述】:

是否可以在编译时将项目附加到std::initializer_list

我正在编写一个结构来尝试在std::initializer_list 中收集来自第 3 方库的一组 const char* 名称,这些名称与名称相同的库中的某些特定类型相关联,但在代码上断开连接(例如这些名称不是类型的一部分,它们甚至不在同一个命名空间中)。

这是我要写的struct

template < typename T, typename... Args >
struct S : S< T >, S< Args... >
{
    static auto
    get_names( )
    {
        // concatenation should go here
        // return S< T >::get_names() + S< Args >::get_names()...
        // or something similar
    }
};

template <>
struct S< lib::types::SpecificTypeA >
{
    static auto
    get_names( )
    {
        // the name is a const char * coming from the same 3rd party lib
        return { lib::names::name_of_specific_type_a };
    } 
};

我正在使用 C++17。

【问题讨论】:

  • 如果你想列出所有名字,不用任何模板就很简单:{lib::names::name_of_specific_type_a, lib::names::name_of_specific_type_b, etc }。你想用你的模板做什么?第一个结构是否应该创建名称的子集?
  • @vll 我试图从更大的代码中提取最小可行示例。我需要一个编译时间列表,它并不总是所有类型的列表。
  • 我认为用std::initializer_list操作是不可行的。您可以创建 std::array&lt;const char*,n&gt; 并将它们连接起来。它并不复杂。
  • 根据变量名称,您也许可以使用宏。 stackoverflow.com/questions/1872220/…
  • std::initializer_list 是一个引用类型。它总是由它绑定到的数组支持。数组就像任何临时绑定到引用一样。如果绑定在那里,它不会超过功能范围。你的方法充满了悬而未决的引用。

标签: c++ c++17 initializer-list compile-time


【解决方案1】:

据我所知,您不能在 C++ 编译时构造任何对象。

在程序启动之前不能构造任何对象。

我们通常在main()开头构造这些对象。不影响性能。

【讨论】:

  • 这不就是constexpr构造函数的作用吗?
  • 对于constexpr的用法误解我深表歉意。
猜你喜欢
  • 2022-11-16
  • 2017-09-12
  • 1970-01-01
  • 2016-01-23
  • 2013-03-27
  • 1970-01-01
  • 2016-08-10
  • 1970-01-01
  • 2013-01-11
相关资源
最近更新 更多