相关疑难解决方法(0)

参数包扩展顺序

我有2个函数来读取二进制文件.

第一个函数sizeof(T)从文件中读取字节:

template<typename T>
T read() { ... some IO operations ... };
Run Code Online (Sandbox Code Playgroud)

第二个函数使用每个模板参数多次调用第一个:

template<typename... Ts>
std::tuple<Ts...> read_all() {
    return std::make_tuple(read<Ts>()...);
};
Run Code Online (Sandbox Code Playgroud)

除第一个函数调用顺序外,一切正常.喜欢的东西

uint32_t a;
uint8_t b;
std::tie(a, b) = read_all<uint32_t, uint8_t>();
Run Code Online (Sandbox Code Playgroud)

第一个将被调用read<uint8_t>(),之后read<uint32>()将反转传递模板参数的顺序,并在文件中以字节顺序混乱.

当然,我可以调用read_all模板参数的颠倒顺序并最终获得正确的顺序,但是有更明显的方法吗?

c++ io templates variadic-templates

5
推荐指数
1
解决办法
532
查看次数

是直接初始化还是复制初始化?

可以通过多种方式来初始化C ++中的对象(类或结构的实例)。某些语法引起对象的直接初始化,而其他语法则导致复制初始化。随着拷贝省音在编译器中启用,两者具有相同的性能。在禁用复制删除的情况下,当您为每个实例选择复制/初始化时,都会有一个附加的复制/移动构造函数调用(复制初始化)。

结论:复制初始化可能会降低性能!

来自以下问题:C ++ 11成员初始值设定项列表与类初始值设定项?我可以得出结论,这将是复制初始化语法:

obj s = obj("value");
Run Code Online (Sandbox Code Playgroud)

这将是直接初始化语法:

obj s{"value"};
Run Code Online (Sandbox Code Playgroud)

 
但是这个呢?

obj s = {"value"};
Run Code Online (Sandbox Code Playgroud)

还有这个:

obj s = obj{"value"};
Run Code Online (Sandbox Code Playgroud)

还有这个:

obj s("value");
Run Code Online (Sandbox Code Playgroud)

或者这个:

obj s = "value";
Run Code Online (Sandbox Code Playgroud)

注意
Bjarne Stroustrup在他的书“使用C ++编程,原理和实践”第二版,第311页,第9.4.2节中比较了一些初始化样式(但不是全部):

struct Date {
    int y,m,d;                     //year, month, day
    Date(int y, int m, int d);     //check for valid date and initialize
    void add_day(int n);           //increase the Date by n days
};
Run Code Online (Sandbox Code Playgroud)

... …

c++ initialization initializer-list c++11 c++14

2
推荐指数
2
解决办法
776
查看次数