当前位置: 首页 > 知识库问答 >
问题:

函数模板如何推断初始值设定项列表的嵌套次数?

刘明朗
2023-03-14

我有一个函数模板,它接受任意嵌套的列表并返回一个数组:

#include <array>
#include <initializer_list>

template<size_t N, typename List>
std::array<size_t,N> some_function (const List& list)
{
    // N is the number of times the list is nested.
    std::array<size_t,N> arr;
    return arr;
}

当我对一些嵌套的std::initializer\u list使用此函数时,如下所示:

int main () {
    using List = std::initializer_list<std::initializer_list<double>>;
    List list = {{1.,2.,3.},{4.,5.,6.}};

    std::array<size_t,2> arr;
    arr = some_function (list);
    return 0;
}

我收到无法推断类型N的错误

无法推断模板参数“N”

  • 如何改进函数模板以推断列表嵌套的次数

共有1个答案

邴越彬
2023-03-14

您可以编写两个重载的constexpr函数模板来计算嵌套时间,并借助于if和SFINAE。

// types have not member type value_type
template <typename T, typename = void>
struct has_value_type: std::false_type {};
// types have member type value_type
template <typename T>
struct has_value_type<T, std::void_t<typename T::value_type>> : std::true_type {};

// return nested times as 0 for types without member type value_type
template<typename T>
constexpr std::enable_if_t<!has_value_type<T>::value, size_t> get_nested_times() {
    return 0;
}
// return nested times as 1 plus times got on the nested type recursively
template<typename T>
constexpr std::enable_if_t<has_value_type<T>::value, size_t> get_nested_times() {
    return 1 + get_nested_times<typename T::value_type>();
}

然后您可以在编译时获取嵌套时间

template<typename List>
auto some_function (const List& list)
{
    // N is the number of times the list is nested.
    constexpr auto N = get_nested_times<List>();
    std::array<size_t, N> arr;
    return arr;
}

现场直播

 类似资料:
  • 我相信现代C初始值设定项列表对于初始化对象非常有用,甚至不需要定义自己的构造函数: 但是,当我的类从另一个类继承时,这不起作用: 我尝试添加

  • 我有以下代码: 我希望输出是:“base constructor,test:50”,但事实并非如此,因为构造函数是在初始化之前调用的,没有错误或警告,它只是编译。 有什么方法可以让构造函数在之后被调用吗?或者这是总体上的糟糕设计? 我正在尝试将所有的init方法和它们的调用放入构造函数insted中,这个行为阻止了我这样做。

  • 我有,它是一个模板类。我想提供一个初始化r列表构造函数,以便我可以方便地编写: 另一方面,我不想在这个列表中有重复项,因为这个类意味着只有唯一的用户输入。我已经看到了许多检查数组中重复项的方法,并提出了以下函数。 我试图结合检查的想法,是否

  • 所以我正在学习构造函数初始值设定项列表,我写了以下代码: 为此我使用了g编译器。它调用的是构造函数而不是复制构造函数。它应该调用复制构造函数,因为我正在创建一个对象来创建另一个对象?这里的问题是什么,标准对此怎么说?

  • 根据价值初始化规则。发生值初始化: 1,5)当使用由空括号或大括号组成的初始值设定项创建无名临时对象时(从C 11开始); 2,6)当一个具有动态存储持续时间的对象是由一个新表达式创建的,初始化器由一对空括号或大括号组成(从C11开始); 3,7)当使用带有空括号或大括号对的成员初始值设定项初始化非静态数据成员或基类时(自C 11起); 4)当使用由一对大括号组成的初始化程序声明命名变量(自动、静

  • 我想表示从一组可变模板参数静态嵌入程序代码(最好是在ROM部分)中的持久内存布局(例如闪存或EEPROM设备)的描述,其中必要的偏移量在编译时自动计算。 目标是创建一个适当的数组初始化器,它可以在运行时迭代,而不会受到的限制,这需要编译时索引。 我创建了一个简单的数据项描述符类,它将一个特定的ID(应该由客户端提供为枚举类型)绑定到数据布局(偏移量和大小): 客户端应使用绑定到特定数据类型和偏移量