gpt4 book ai didi

c++ - 如何在编译时将 C 字符串转换为 int?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:11:06 32 4
gpt4 key购买 nike

我希望能够将整数或 double (或字符串)作为模板参数传递并且在某些情况下将结果转换为整数并将其用作模板参数输入类(class)。

这是我尝试过的:

template <typename MPLString>
class A
{
// the following works fine
int fun()
{
// this function should return the int in the boost mpl type passed to it
// (e.g. it might be of the form "123")
return std::stoi(boost::mpl::c_str<MPLString>::value);
}

// the following breaks because std::stoi is not constexpr
std::array<int, std::stoi(boost::mpl::c_str<MPLString>::value)> arr;
};

我能以某种方式做到这一点吗?我试过 std::stoiatoiconstexpr 都没有...任何关于如何完成的想法(我 不能将模板参数更改为直接采用 int,因为它可能是 double )。

最佳答案

定义 constexpr stoi 对于常规的 C 字符串来说并不难。可以定义如下:

constexpr bool is_digit(char c) {
return c <= '9' && c >= '0';
}

constexpr int stoi_impl(const char* str, int value = 0) {
return *str ?
is_digit(*str) ?
stoi_impl(str + 1, (*str - '0') + value * 10)
: throw "compile-time-error: not a digit"
: value;
}

constexpr int stoi(const char* str) {
return stoi_impl(str);
}

int main() {
static_assert(stoi("10") == 10, "...");
}

throw 表达式在常量表达式中使用时无效,因此它会触发编译时错误而不是实际抛出。

关于c++ - 如何在编译时将 C 字符串转换为 int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25195176/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com