use*_*392 6 c++ arrays constexpr c++11
是否可以constexpr
在某一点声明一个 const 数组(可能),然后在另一个地方定义它,一次一个元素?
例如
extern constexpr int myArray[100];
myArray[0] = myConstexprFunction(0);
myArray[1] = myConstexprFunction(1);
// ...
myArray[100] = myConstexprFunction(100);
Run Code Online (Sandbox Code Playgroud)
我正在尝试做的将需要这样的东西。也许可以使用以下内容:http : //b.atch.se/posts/constexpr-counter/
但是如果这种技术在下一个 C++ 标准中是非法的(我希望不是),我想使用更安全的技术。
[编辑]放宽一些要求怎么样..假设我想做这样的事情:
constexpr int myConstExprFunction(int arg) { return arg + 100;}
// other code...
constexpr int a = myConstExprFunctionBegin(10);
constexpr int b = myConstExprFunction(20);
constexpr int c = myConstExprFunction(30);
constexpr int d = myConstExprFunctionEnd(40);
Run Code Online (Sandbox Code Playgroud)
我想要的是 myConstExprFunctionEnd 能够使用先前函数创建的值生成最终数组。当然,一切都在编译时。
[EDIT2] C++11 解决方案非常受欢迎
constexpr
最近C++的要求很宽松,所以你可以这样写:
// requires C++17:
constexpr auto myArray = [] {
std::array<int, 100> result {};
for (size_t i = 0; i < 100; ++ i) {
result[i] = i * i;
}
return result;
}();
Run Code Online (Sandbox Code Playgroud)
注意我使用了std::array<int, 100>
而不是int[100]
因为函数不能返回 C 数组。
上面的代码需要 C++17 有两个原因:
constexpr
拉姆达operator[]
不是constexpr
在C之前++ 17使用单独的 constexpr 函数可以轻松解决问题 1。问题 2 只能通过定义您自己的数组包装器来解决。
// requires C++14:
template <typename T, size_t n>
struct ConstexprArray {
T data[n];
constexpr ConstexprArray() : data{} {}
constexpr T& operator[](size_t i) { return data[i]; }
};
constexpr auto initialize_my_array() -> ConstexprArray<int, 100> {
ConstexprArray<int, 100> result {};
for (size_t i = 0; i < 100; ++ i) {
result[i] = i * i;
}
return result;
}
constexpr auto myArray = initialize_my_array();
Run Code Online (Sandbox Code Playgroud)
看看您的编辑,我只会回答no,因为编译器无法将一组变量转换为数组。它只是不那样工作。C++ 中没有任何构造可以接受一堆声明、删除它们并用另一个声明替换它。源代码预处理器或生成器可能能够允许您寻求的语法。
如果您对不需要外部工具的解决方案感兴趣,您可以创建一个constexpr
返回数组的函数:
constexpr auto makeMyArray() {
std::array<int, 100> myArray{};
myArray[0] = myConstExprFunction(10);
myArray[1] = myConstExprFunction(20);
// ...
return myArray;
}
Run Code Online (Sandbox Code Playgroud)
然后,初始化你的数组:
constexpr auto myArray = makeMyArray();
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1468 次 |
最近记录: |