首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何测试带有编译时已知长度的std::initializer_list的ctor?

在测试带有编译时已知长度的std::initializer_list的ctor时,可以采取以下步骤:

  1. 创建一个测试用例,包含一个std::initializer_list对象和一个期望的长度值。
  2. 调用被测试的构造函数,将std::initializer_list对象作为参数传入。
  3. 使用std::initializer_list的size()函数获取实际的长度值。
  4. 将实际的长度值与期望的长度值进行比较,确保它们相等。
  5. 如果长度值不相等,可以输出错误信息或者抛出异常,以便在测试中进行断言。

下面是一个示例代码:

代码语言:txt
复制
#include <initializer_list>
#include <iostream>

class MyClass {
public:
    MyClass(std::initializer_list<int> list) : data(list) {}

    int getSize() const {
        return data.size();
    }

private:
    std::initializer_list<int> data;
};

int main() {
    std::initializer_list<int> list = {1, 2, 3};
    int expectedSize = 3;

    MyClass obj(list);
    int actualSize = obj.getSize();

    if (actualSize == expectedSize) {
        std::cout << "Test passed!" << std::endl;
    } else {
        std::cout << "Test failed: expected size " << expectedSize << ", actual size " << actualSize << std::endl;
    }

    return 0;
}

在这个示例中,我们创建了一个MyClass类,它接受一个std::initializer_list作为构造函数的参数。在main函数中,我们创建了一个包含三个元素的std::initializer_list,并将其传递给MyClass的构造函数。然后,我们使用getSize函数获取实际的长度值,并将其与期望的长度值进行比较,输出相应的测试结果。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云函数计算(云原生、服务器运维):https://cloud.tencent.com/product/scf
  • 腾讯云数据库(数据库):https://cloud.tencent.com/product/cdb
  • 腾讯云CDN(网络通信):https://cloud.tencent.com/product/cdn
  • 腾讯云安全产品(网络安全):https://cloud.tencent.com/solution/security
  • 腾讯云音视频处理(音视频、多媒体处理):https://cloud.tencent.com/product/mps
  • 腾讯云人工智能(人工智能):https://cloud.tencent.com/product/ai
  • 腾讯云物联网(物联网):https://cloud.tencent.com/product/iotexplorer
  • 腾讯云移动开发(移动开发):https://cloud.tencent.com/product/mobapp
  • 腾讯云对象存储(存储):https://cloud.tencent.com/product/cos
  • 腾讯云区块链(区块链):https://cloud.tencent.com/product/baas
  • 腾讯云虚拟专用云(元宇宙):https://cloud.tencent.com/product/vpc
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Chapter 3: Moving to Modern C++

::initializer_list参数,在使用花括号初始化时,编译器会强烈地偏向于调用使用std::initializer_list参数重载构造函数 class Widget { public...construction 编译器非常偏向选择std::initializer_list构造函数,以至于即便最匹配std::initializer_list构造函数不能被调用,编译器也会优先选择它...只有当没有办法在花括号初始化参数类型和std::initializer_list参数类型之间进行转换编译器才会重新选择正常构造函数 class Widget { public:...::initializer_list构造函数,此时调用空花括号初始化,编译器会解析为调用默认构造函数,而要解析成std::initializer_list构造函数,需要在花括号中嵌套一个空花括号进行初始化...它们值也许会被放在只读内存区中,它们值也能被用在整型常量表达式中,例如数组长度,整型模板参数,枚举值,对齐指示符等等 当constexpr函数使用constexpr对象,它们会产生编译期常量,如果

1.8K60

真没想到nullptr和NULL得区别,大了去了

::initializer_list型别的形参 //那么 {} 会强烈优先选择带有这个形参重载版本 class WidgetBB{ public: WidgetBB(int i...复制构造函数 // WidgetBB w6{w444};//大括号,调用带有 std::initializer_list型别形参构造函数,w4返回值被强制转成成 float,随后 float又被强制转成了...//如果的确想调用一个带有 std::initializer_list 型别形参构造函数,并传入一个空 std::initializer_list的话 //可以通过把空大括号对作为构造函数实参方式实现这个目的...,得到一个包含 2 个元素 std::vector doSomeWork>(10,20); 测试端 int main() { cout<<"XXXX: "<...//引用C++11 中 std::tuple型别的各个阈,假设为一个社交网站准备一个元组来持有名字,电子邮件和声望值 using UserInfo = std::tuple<std::string,

1.7K30
  • 【重学 C++】06 | C++该不该使用 explicit

    , std::string a, int p) :title_(t), author_(a), pages_(p) {}};改完Book定义后,直接编译代码,发现是可以编译通过,但再看下代码输出:call...所以会编译失败。单入参std::initializer_list构造函数std::initializer_list 是 C++11 中引入一种特殊类型,用于简化在初始化对象传递初始化列表过程。...() {MyClass obj = {1, 2, 3, 4, 5}; // 使用初始化列表语法进行隐式转换}对于带有std::initializer_list类型参数构造函数,也不推荐使用explicit...因为使用std::initializer_list作为构造函数入参,就是为了方便初始化对象。...对于带有单入参std::initializer_list构造函数,也不推荐使用explicit,以方便使用初始化列表语法进行隐式转换。同类型扩展类,为了避免差异化,隐式转换会更合适。

    22600

    C++17中新特性

    // c++11 auto x3{ 1, 2 }; // std::initializer_list auto x4 = { 3 }; // decltype(x4) is std::initializer_list... auto x5{ 3 }; // std::initializer_list 这三种方式初始化变量,最终类型推导结果都是 std::initializer_list<int...这是因为 当用于auto声明变量表达式是{}括起来,推导型别就会变成 std::initializer_list。...,值不存在则抛出 std::bad_optional_access 异常 value_or() // 值存在返回值,不存在返回默认值 3. std::any 一个类型安全可以保存任何值容器...string_view 本身没有申请额外内存来存储原始字符串data, 仅仅保存了原始字符串地址和长度等信息。 在很多情况下,我们只是临时处理字符串,本不需要对原始字符串一份拷贝。

    4.9K30

    C++一行代码实现任意系统函数Hook!

    std::is_same_v){ return RET{}; } }}; 这里即使wcscmp_compiletime函数可以实现编译字符串比较也不能实现编译结果计算...,测试是这样原因,应该是编译器还是将funcName当做一个外部符号有关?...std::is_same_v){ return RET{}; } }}; 四、从汇编角度看生成一个API案例 简化后测试代码如下:...推荐阅读 深入理解LinuxTCP三次握手! 如何用Go实现一个异步网络库? 如何优雅地实现C++编译期多态? C++异步:libunifexscheduler实现!...温馨提示:因公众号平台更改了推送规则,公众号推送文章文末需要点一下“赞”和“在看”,新文章才会第一间出现在你订阅列表里噢~

    1.1K20

    C++ 特性使用建议

    2.右值引用 建议:只在定义移动构造函数与移动赋值操作使用右值引用,区分std::move与std::forward作用。...但是缺省参数函数调用代码难以呈现所有参数,开发者只能通过查看函数申明或定义确定如何使用API,当缺省参数不适用于新代码可能导致重大问题。...比如进行工厂类测试,用来验证一个新建对象是否为期望动态类型。RTTI 对于管理对象和派生对象关系也很有用。 缺点: (1)在运行时判断类型通常意味着设计问题。...千万别用宏进行条件编译,会令测试更加痛苦 ,当然使用条件宏防止头文件重复包含是个特例。...,哪怕没有接收 std::initializer_list 构造函数。

    1.7K20

    《Effective Modern C++》读书笔记

    ,收缩转换); 用{}替代(),可以避免A a()被编译器解析(parsed)成函数声明问题; 缺点: 和auto结合得不友好,auto遇到{},auto推导成了std::initializer_list...,这不是所期望; 当类多个构造函数里,有一个是用std::initializer_list,要注意其他构造函数不能用{}语法; 当类有类型转换函数,第二个缺点会变得更严重:复制构造函数可能不会被调用...; 当存在std::initializer_list构造函数,即使构造代码不正确,编译器也不会转而使用其他构造函数来构造(即使其他构造函数更加match),而是报错。...(一种例外情况是当{...}里元素不能被转换成std::initializer_listT编译器才会转而使用其他构造函数); 编写类构造函数最佳实践 当你要给自定义类加上std::initializer_list...从第二点可以反推,如果一个函数不是constexpr,那么即使你传递给它参数都是编译时期已知,这个函数也不一定就会在编译时期执行。 具体怎么玩?

    1.8K20

    《Effective Modren C++》 进阶学习(上)

    那完美的标准是什么,我想不同设计师都会有自己一套标准。而在实际编码中,如何将个人标准愈发完善,愈发得到同事认可,一定需要不断积累。...编译,通过编译器诊断信息 通过编译器出错提供错误消息也可以查看推导结果。 运行时,通过C++提供接口typeid或者Boost.TypeIndex。 但是编译打印类型并不是完全可靠!...编译错误!要求变窄转换 只有当传入参数在编译器上无法转换成std::initializer_listT类型,才会匹配普通构造函数。...当使用{}初始化无参数,会优先匹配默认构造函数,如果要匹配std::initializer_list构造函数,需要传入{}。 8....使用constexpr可以在编译对常量表达式进行类型检查和错误检查。如果在常量表达式中使用了不允许操作或无效值,编译器会在编译发出错误或警告,帮助我们及早发现并修复问题。 16.

    17920

    CC++开发基础——可变参数与可变参数模板

    2.如果可变参数参数类型不同,可以使用可变参数模板。 C语言中,在定义可变参数函数,使用省略号"..."表示参数是可变。...initializer_list参数可以使用迭代器来访问。 initializer_list实例中传入参数需要使用{}把多个参数括起来。...运行结果: 1 2 3.14 test I am empty. 4.sizeof...运算符 由于带有"typename T"参数可变参数模板函数,总是需要再定义一个同名模板函数或者普通函数来搭配使用...运算符来保证,在不重复定义同名函数情况下让递归退出。 "sizeof..."运算符可以判断参数包中元素数量。 退出递归方式: 判断当参数包元素个数为零,退出函数调用。...为了解决以上问题,C++17标准中引入了编译期if条件判断表达式"if constexpr"。

    54850

    性能大杀器:c++中copy elision

    ,输出: Default ctor Default ctor PS:本文中所使用编译器及版本为gcc 11.4.0,如果未做显式说明,在编译过程中都加上-std=c++11选项。...好了,仍然是上面的代码,如果编译选项变成-std=c++11 -fno-elide-constructors,输出试试,看看会是什么结果~~ emm,在本地尝试编译并运行了下: Default ctor...,此处假设为temp2 Copy ctor // 通过调用拷贝构造函数,将temp2值赋值给o2 在上一节中,我们提到过,可以通过使用移动构造方式来避免拷贝,为了测试该功能,尝试在Obj类中新增一个移动构造函数...这意味着,当函数返回一个自动对象编译器可以优化掉不必要拷贝或移动操作,直接将自动对象构造到函数调用返回对象中,以提高效率。这种优化在 C++ 标准中被明确规定,以支持更高效代码生成。...标准这一规定,使得原本不支持拷贝对象,作为函数返回值,也成了可能。

    13310

    C++特性使用建议

    2.右值引用 建议: 只在定义移动构造函数与移动赋值操作使用右值引用,区分std::move与std::forward作用。...但是缺省参数函数调用代码难以呈现所有参数,开发者只能通过查看函数申明或定义确定如何使用API,当缺省参数不适用于新代码可能导致重大问题。...比如进行工厂类测试,用来验证一个新建对象是否为期望动态类型。RTTI 对于管理对象和派生对象关系也很有用。 缺点: (1)在运行时判断类型通常意味着设计问题。...用宏进行条件编译… 这个,千万别这么做,会令测试更加痛苦 (#define 防止头文件重包含当然是个特例)。...,哪怕没有接收 std::initializer_list 构造函数。

    1.9K30

    Effective Modern C++翻译(3)-条款2:明白auto类型推导

    f 在f函数调用中,编译器使用expr来推导T和ParamType类型。...,x5类型需要被推导出来,另外因为auto是用大括号初始化式初始化,x5类型必须被推导为std::initializer_list,但是std::initializer_list是一个模板,所以实例化模板...std::initializer_list模板类型,而模板类型推导面对大括号初始化式(braced initializer),代码将不会通过(这是由于完美转发perfect forwarding结果...std::initializer_list类型变量,但他们本意却是想声明一个其他类型变量。...auto用于C++14lambda(产生一个通用lambda(generic lambda))参数类型说明符, std::vector v; auto resetV = [&v](const

    698100

    c++17好用新特性总结

    auto x5{ 3 }; // std::initializer_list 这三种方式初始化变量,最终类型推导结果都是 std::initializer_list ,...std::endl; }(); } 在clang环境下,可以在lambda表达式捕获显式引入一个引用变量通过编译: for(const auto& [key, value]: map){...c++17 std::pair p3{3.14, "pi"s}; if constexpr if constexpr语句是编译if判断语句,在C++17以前做编译条件判断往往通过复杂SFINAE...mutex_; unsigned int value_ = 0; }; std::string_view std::string_view顾名思义是字符串“视图”,类成员变量包含两个部分:字符串指针和字符串长度...std::any应当很少是程序员第一选择,在已知类型情况下,std::optional, std::variant和继承都是比它更高效、更合理选择。

    3.2K10

    再探函数

    initializer_list形参 initializer_list是一种标准库类型,用于表示某种特定类型数组 initializer_list也是一种模板类型 支持size(),begin(...),end()等操作 向initializer_list形参中传递一个值序列,则必须把序列放在花括号中 #include using namespace std; void print..._1(initializer_list str) { //遍历实参表列,使用initializer_list对象成员begin和end进行遍历 cout<<"parameter...如果函数返回是内置类型,则花括号包围列表最多包含一个值,而且该值所占空间不应该大于目标类型空间 如果函数返回是类类型,由类本身定义初始值如何使用 #include #include...func:存放当前调试函数名字 FILE:存放文件名字符串字面值常量 LINE:存放文件当前行号整型字面值 TIME:存放文件编译时间字符串字面值常量 DATE:存放文件编译日期字符串字面值常量

    37510

    C++11基础学习系列三

    今天来了解一下C++中数组。数组也是存放相同类型容器,数组大小是固定不变(编译时数组维度必须是已知)。如果想动态操作容器(增加,删除等)或者事先不知道容器大小,请使用vector。...在使用数组注意一下几点: 1.数组维度必须是常量表达式,在编译已知。...局部静态对象 通过static将局部对象定义,执行第一次经过对象定义语句初始化,知道程序结束销毁,内置类型局部静态变量初始化为0....void func(const int i); 尽量使用常量引用 可变形参函数 可变形参是通过initializer_list实现,但是要求类型一致。...#include void message(std::initializer_list temp){ for(auto i:temp){

    81640

    初始化|这些年踩过

    ,从使用方式上来看,更加统一,显然统一初始化是我们进行初始化时候首选,当然了,需要注意一些细节,尤其是对于存在参数为std::initializer_list容器类型来说。...之所以有这个报错,是因为当C++无法区分“对象创建”和“函数声明”编译器默认将该语句解释为“函数声明”。...编译器有个特点,对于以花括号初始化方式则认为是统一初始化,如果构造函数中同样存在std::initializer_list为参数构造函数,那么则优先调用: class MyClass { public...)默默执行,而开发人员则认为它正在使用第一个构造函数,emm,后果不堪设想~~ 在上面提了,编译器会优先调用参数为std::initializer_list构造函数,但是有个例外: class MyClass...{ {} }; 结语 这块终于写完了,一边写一边改,内容确实太杂了,本来想是把遇到坑都写出来,一半会想不起来,只能等以后了。

    18810

    【笔记】C++2.0新特性

    定义出来, 不但有元素个数限制而且实现非常暴力 Initializer List 编译器见到{}时会自动构造一个initializer_list, 然后尝试调用对象initializer_list...与现有的普通函数是否匹配, 如果匹配(也就是和()一致)则调用, 否则编译失败 两个版本函数同时存在, 优先调用initializer_list版本函数 当使用()进行调用时, 则只能使用普通版本函数调用...当在构造函数中使用, 代替()但没有指明参数, 会进行默认构造, 即使是基本类型也会被默认构造为0 initializer_list本质是一个数组, 其类中成员是指向数组迭代器和记录initializer_list...长度size_type....接受一个默认为truebool参数, 当参数为true时会关闭编译器对这个函数生成关于异常栈准备工作, 从而提高函数执行效率.

    88820

    什么?CC++面试过不了?因为你还没看过这个!

    内联是在编译器建议编译器内联,而虚函数多态性在运行期,编译器无法知道运行期调用哪个代码,因此虚函数表现为多态性(运行期)不可以内联。...12; // 测试 1:设置全局 count 值为 12 A::count = 22; // 测试 2:设置类 A count 为 22 fun();...申请到内存中初始值不确定。 calloc:为指定长度对象,分配能容纳其指定个数内存。申请到内存每一位(bit)都初始化为 0。 realloc:更改以前分配内存长度(增加或减少)。...当增加长度,可能需将以前分配区内容移到另一个足够大区域,而新增区域内初始值则不确定。 alloca:在栈上申请内存。程序在出栈时候,会自动释放内存。...原因:C++ 是静态绑定语言,编译器管理栈上对象生命周期,编译器在为类对象分配栈空间,会先检查类析构函数访问性。

    3.7K50
    领券