根据我目前对的理解,我想以最好的方式来表达这个问题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成为int和v成为2。但是,由于大多数通用模板类type traits显然都继承自std::bool_constant,因此基类实例化首先如何发生?由继承者返回的将值(可能)转换为trueor 的基础逻辑是什么?falseoperator bool
可能的实施
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。 …
该问题是有关std :: add_pointer实现的A问题的后续内容
有以下参考:
否则(如果T是cv或ref限定的函数类型),则提供成员typedef类型,即类型T。
基于阅读非静态成员函数:const,volatile和ref限定成员函数,我的理解是对于具有给定cv和/或ref限定条件的非静态成员函数,
a)在cv函数this范围内,函数的资格也适用于指针
b)该ref函数的限定不适用于this该函数范围内的指针
鉴于此,为什么在非静态成员函数具有或资格的情况下std::add_pointer不能为成员提供?typedef type T*cvref
我正在经历实现定义的行为控制
并且有以下与 相关的文字#pragma once:
与头文件保护不同的是,这个 pragma 使得不可能在多个文件中错误地使用相同的宏名称。
我不确定这意味着什么。有人可以解释一下吗?
TIA
给定一个从头到尾的迭代器,STL中是否有一个容器,可以让我动态地同时从两端填充数据,而不必事先分配最大大小?根据我的理解,我可以使用诸如vector或string之类的模板,可以使用诸如push_back()方法沿向前方向动态增长。或者,我可以使用具有预定大小的数组之类的模板,该模板可以同时在正向和反向访问,以填充数据。
我正在寻找的是一个模板,该模板将使我能够灵活地适应动态增长的容器(如矢量),同时允许从两端(如数组)进行数据填充。在数组的情况下,开始和结束迭代器之间存在预定间隙(由于固定大小);对于动态容器模板,当我从任一端同时填写数据时,我希望这个差距会动态增长。
欣赏你的想法。
谢谢
维诺德
是否可以删除迭代器指向的特定元素std array?我知道std vector提供了erase()方法。是否也可以实现相同的逻辑std array?
根据上一个帖子的公认答案
声明不是表达式。在某些地方允许使用表达式,但不允许使用声明。三元运算符?的左侧是其中之一。
现在,考虑以下代码段:
#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++ ×7
std ×2
c++17 ×1
containers ×1
erase ×1
pragma ×1
return ×1
stdarray ×1
stl ×1
type-traits ×1