【发布时间】: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<const char*,n>并将它们连接起来。它并不复杂。 -
根据变量名称,您也许可以使用宏。 stackoverflow.com/questions/1872220/…
-
std::initializer_list是一个引用类型。它总是由它绑定到的数组支持。数组就像任何临时绑定到引用一样。如果绑定在那里,它不会超过功能范围。你的方法充满了悬而未决的引用。
标签: c++ c++17 initializer-list compile-time