在类上启用std::get支持
Enable std::get support on class
我必须特化哪些模板来支持std::get?
struct MyClass {
int a;
};
template <const size_t I>
struct MyContainer {
MyClass array[I];
};
我要专门化什么才能做:
MyContainer<16> mc;
std::get<0>(mc);
std::get
不是标准库的自定义点;三个函数模板重载(对于pair
, tuple
和array
)不明确地允许用户定义的重载,因此17.6.4.2.1p1适用,并且添加自己的函数模板重载声明是未定义的行为。
注意get
作为非限定的名称在c++ 17中是自定义点;结构化绑定声明协议使用它来访问类元组元素;但这是一个非限定名,而不是限定名std::get
。
也就是说,如果你要写:
namespace std {
template<size_t I, size_t N> MyClass &get(MyContainer<N> &c) { return c.array[I]; }
}
和类似的右值引用和const引用重载,您的程序可能会像您期望的那样工作。
然而,由于标准已经提供了array
:
template<size_t N> using MyContainer = std::array<MyClass, N>;
我猜你想实现一些算法,需要访问任意数组类容器使用编译时索引,因此目的是使用一些函数(如std::get
)来统一执行该任务?!在这种情况下,它与使begin
和end
对您的类可用是相同的业务。您只需在您声明容器类的名称空间中声明一个函数get
,并让ADL完成它的工作。
template <unsigned I, unsigned N>
MyClass& get (MyContainer<N>& c) { return c.array[I]; }
template <unsigned I, unsigned N>
MyClass const& get (MyContainer<N> const& c) { return c.array[I]; }
在你的算法中,你只使用get
(没有std
命名空间前缀),ADL将调用正确的函数。因此,对于array
, tuple
和pair
等标准结构,std::get
被调用,而对于您提供的容器,get
函数被调用。
int main(){
std::array<int, 3> a {{0,1,2}};
auto t = std::make_tuple(0.0, 1.0f, 2);
auto p = std::make_pair('0', 4.4);
MyContainer<3> c;
std::cout << get<1>(a) << std::endl;
std::cout << get<1>(t) << std::endl;
std::cout << get<1>(p) << std::endl;
std::cout << get<1>(c).a << std::endl;
return 0;
}
示例相关文章:
- 编译时未启用intel oneApi CUDA支持
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用CMake检测支持的C++标准
- Cpp-Tuple使用带有变量的get
- 为什么istream不支持右值提取
- 当我编译webrtc服务器时,Windows上只支持clang-cl
- 扩展光电二极管探测器以支持多个传感器
- MSVC是否支持C++11样式的属性而不是__declspec
- 在使用GPU支持编译Tensorflow时,会遇到CUDA_TOOLKIT_PATH未绑定变量
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 通过 get-Method 访问变量在类外不起作用
- 为什么无论你输入什么,这"while(cin.get(str,3))"只运行一次?
- 错误:(-210:不支持的格式或格式组合)功能'create'中的硬件视频解码器不支持视频源
- Boost.Asio/OpenSSL HTTPS GET certificate trouble
- C++中是否有任何函数等同于python中字典的get函数?
- 哪个C++规范开始支持 std::vector
- 如何检测VS C++编译器是否支持C++11?
- 使用istringstearm和get行缓慢读取文件
- 为什么 std::initializer_list 不支持 std::get<>、std::tuple_size 和 std::tuple_element
- 在类上启用std::get支持