c++ - 在结构中初始化数组
问题描述
假设我们有一些模板结构,有时它的模板应该是一个数组。如何在结构中初始化数组?
这
template<typename T>
struct A {
T x;
A(T x) : x(x) {}
};
int a[6];
A<decltype(a)> b(a);
编译时产生错误:
error: array initializer must be an initializer list
A(T x) : x(x) {}
^
UPD1。这个东西使用的更完整的代码:
template<typename T>
struct A {
T x;
A(const T& x) : x(x) {}
A(const T&& x) : x(std::move(x)) {}
};
template<typename T>
A<typename std::remove_reference<T>::type> make_A(T&& a) {
return A<typename std::remove_reference<T>::type>(std::forward<T>(a));
}
auto a = make_A("abacaba");
解决方案
一个通用的解决方案是为数组提供一个特殊的构造函数(当T
是数组时启用),它将源数组复制到结构的数组。它有效,但丢弃了数组的移动语义。
#include <iostream>
#include <type_traits>
#include <string>
#include <tuple>
template<typename T>
struct A {
using value_type = std::remove_const_t<T>;
value_type x;
template<class U=T> A(const T& src, std::enable_if_t<!std::is_array_v<U>, int> = 0) : x(src) {}
template<class U=T> A(const T&& src, std::enable_if_t<!std::is_array_v<U>, int> = 0) : x(std::move(src)) {}
template<class U=T> A(const T& src, std::enable_if_t< std::is_array_v<U>, int> = 0) { std::copy(std::begin(src), std::end(src), std::begin(x)); }
};
template<typename T>
auto make_A(T&& a)
{ return A<typename std::remove_reference_t<T>>(std::forward<T>(a)); }
int main()
{
auto a1 = make_A("the answer");
std::ignore = a1;
auto a2 = make_A(42);
std::ignore = a2;
}
如果您有时需要T
用于const
非数组,则改进将定义value_type
为T
好像T
不是数组,std::remove_const_t<T>
否则定义为非数组。
推荐阅读
- java - 如何检查数字是否有小数位/是否为整数?
- java - 如何使用自动生成的文档 ID 从 android 的 firestore 中删除项目
- python - 在 colab 中调试 git cloned repo 代码内部模块
- python - 如何将 XLSX 文件转换为与 XLSX 同名的 CSV?
- swift - 在 SwiftUI 的 onChange 中更新绑定值的条件反应?
- javascript - 我如何检查数组编号从“pages”到“endingPages”,如果它们匹配返回true,否则为false
- css - element.style 未被自定义 CSS 覆盖
- python - 如何模仿可以使用 Python 请求刷新自身的浏览器
- java - 连接两个表时的休眠异常
- mono.cecil - 为什么 PublicKeyToken 改变了?