0xd*_*eef 3 c++ templates template-meta-programming constexpr compile-time-type-checking
我目前正在尝试找到一种干净的方法来创建模板化的字节数组结构,该结构可以根据其构造函数是否使用或不使用 constexpr 关键字实例化来进行不同的初始化,并且如果可能的话,我还想将其应用于其他方法和函数,我想知道是否有办法实现这一点?
这是我想要实现的目标的示例:
#include <iostream>
#include <cstring>
template<size_t N>
struct bytearray {
char data[N];
constexpr bytearray(char val) : data() {
if constexpr (... is compile time instantiated ...) {
for (size_t i = 0; i < N; ++i) {
data[i] = val;
}
} else {
std::memset(data, val, N);
}
}
};
int main() {
constexpr bytearray<10> A(7);
bytearray<10> B(7);
}
Run Code Online (Sandbox Code Playgroud)
因此,A
在编译时实例化该类将使用for
循环,memcpy
如果不是的话。
您正在寻找if consteval
:
constexpr bytearray(char val) : data() {
if consteval {
for (size_t i = 0; i < N; ++i) {
data[i] = val;
}
} else {
std::memset(data, val, N);
}
}
Run Code Online (Sandbox Code Playgroud)
这是 C++23 的功能。在 C++20 中,您可以使用std::is_constant_evaluated
:
constexpr bytearray(char val) : data() {
if (std::is_constant_evaluated()) {
for (char& byte : data) {
byte = val;
}
} else {
std::memset(data, val, N);
}
}
Run Code Online (Sandbox Code Playgroud)
尽管在这种特定情况下请注意,但检查并不是必需的。将被编译为与任何有价值的编译器上的for (size_t i = 0; i < N; ++i) data[i] = val;
a 相同的东西。memset
归档时间: |
|
查看次数: |
59 次 |
最近记录: |