小编Vin*_*nod的帖子

了解类型特征的体系结构

根据我目前对的理解,我想以最好的方式来表达这个问题type traits

我的理解是,所有模板类都type traits继承自std::integral_constant,它包装了value实例化模板类及其的表示形式type。此外,如其定义所示,中的通用模板类type traits继承自的辅助别名模板std::integral_constant,即std::bool_constant

例如,对于,从继承std::is_arithmetic的类型是,这意味着模板类从继承。此外,模板类还从其基础继承,该基础应将对象转换为和(可能将其作为结果返回)。valuestd::integral_constantboolstd::bool_constantstd::is_arithmeticoperator boolboolvalue

所以我的问题是:整个语义如何结合在一起?

在一个实例的情况下 std::is_arithmetic<2>,如果假设基地是std::integral_constant<typename T, T v>T成为intv成为2。但是,由于大多数通用模板类type traits显然都继承自std::bool_constant,因此基类实例化首先如何发生?由继承者返回的将值(可能)转换为trueor 的基础逻辑是什么?falseoperator bool

c++ type-traits c++17

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

关于std::add_pointer的实现的一个问题

来自std::add_pointer

可能的实施

namespace detail {

template <class T>
struct type_identity { using type = T; }; // or use std::type_identity (since C++20)

template <class T>
auto try_add_pointer(int) -> type_identity<typename std::remove_reference<T>::type*>;
template <class T>
auto try_add_pointer(...) -> type_identity<T>;

} // namespace detail

template <class T>
struct add_pointer : decltype(detail::try_add_pointer<T>(0)) {};
Run Code Online (Sandbox Code Playgroud)

上述(可能的)实现的描述如下:

如果 T 是引用类型,则提供成员 typedef type,它是指向引用类型的指针。

否则,如果 T 命名对象类型、非 cv 或 ref 限定的函数类型或(可能是 cv 限定的)void 类型,则提供类型 T* 的成员 typedef 类型。

否则(如果 T 是 cv 或 ref 限定的函数类型),则提供成员 typedef type,它是类型 T。 …

c++ std

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

非静态成员函数的std :: add_pointer实现

该问题是有关std :: add_pointer实现的A问题的后续内容

std :: add_pointer下

有以下参考:

否则(如果T是cv或ref限定的函数类型),则提供成员typedef类型,即类型T。

基于阅读非静态成员函数:const,volatile和ref限定成员函数,我的理解是对于具有给定cv和/或ref限定条件的非静态成员函数,

a)在cv函数this范围内,函数的资格也适用于指针

b)该ref函数的限定不适用于this该函数范围内的指针

鉴于此,为什么在非静态成员函数具有或资格的情况下std::add_pointer不能为成员提供?typedef type T*cvref

c++ std language-lawyer

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

#pragma once 与包含守卫

我正在经历实现定义的行为控制

并且有以下与 相关的文字#pragma once

与头文件保护不同的是,这个 pragma 使得不可能在多个文件中错误地使用相同的宏名称。

我不确定这意味着什么。有人可以解释一下吗?

TIA

c++ pragma include-guards

4
推荐指数
1
解决办法
3296
查看次数

哪个STL容器可以双向增长?

给定一个从头到尾的迭代器,STL中是否有一个容器,可以让我动态地同时从两端填充数据,而不必事先分配最大大小?根据我的理解,我可以使用诸如vector或string之类的模板,可以使用诸如push_back()方法沿向前方向动态增长。或者,我可以使用具有预定大小的数组之类的模板,该模板可以同时在正向和反向访问,以填充数据。

我正在寻找的是一个模板,该模板将使我能够灵活地适应动态增长的容器(如矢量),同时允许从两端(如数组)进行数据填充。在数组的情况下,开始和结束迭代器之间存在预定间隙(由于固定大小);对于动态容器模板,当我从任一端同时填写数据时,我希望这个差距会动态增长。

欣赏你的想法。

谢谢

维诺德

c++ containers stl

3
推荐指数
1
解决办法
61
查看次数

从 std 数组中删除元素

是否可以删除迭代器指向的特定元素std array?我知道std vector提供了erase()方法。是否也可以实现相同的逻辑std array

c++ erase stdarray

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

返回开关的三元运算符

根据上一个帖子的公认答案

声明不是表达式。在某些地方允许使用表达式,但不允许使用声明。三元运算符?的左侧是其中之一。

现在,考虑以下代码段:

#include <iostream>
using std::cout;
using std::endl;

enum struct status{invalid=0, valid};

status test (void);

int main (void){
    status s = test();
    cout << static_cast<int>(s) << endl;
    return (0);
}

status test (void){
    static auto invocation_count = 0;
    ++invocation_count;
    //return (invocation_count % 2) ? (status::invalid) : (status::valid);
    (invocation_count % 2) ? (return (status::invalid)) : (return (status::valid));
}
Run Code Online (Sandbox Code Playgroud)

该函数test()无法编译(请注意,编译器错误日志在原始测试代码中显示行号):

g++ -ggdb -std=c++17 -Wall -Werror=pedantic -Wextra  -c code.cpp
code.cpp: In function ‘status test()’:
code.cpp:19:31: error: expected primary-expression …
Run Code Online (Sandbox Code Playgroud)

c++ return ternary-operator

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