If 语句未能评估条件
If statement failing to evaluate condition
我有一个基本的 class,它包含两个枚举器,一个用于输入,一个用于输出。它有两个成员函数,都是静态的。第一个函数只是一个静态函数,return 是一个基于输入的值。它将调用第二个函数,该函数是一个 constexpr 函数模板,它将 return constexpr 值。您可以在此处查看完整的 class。
class Foo {
public:
enum Input {
INPUT_0 = 0,
INPUT_1,
INPUT_2
};
enum Output {
OUTPUT_0 = 123,
OUTPUT_1 = 234,
OUTPUT_2 = 345
};
static uint16_t update( uint8_t input ) {
if ( static_cast<int>(input) == INPUT_0 )
return updater<INPUT_0>();
if ( static_cast<int>(input) == INPUT_1 )
return updater<INPUT_1>();
if ( static_cast<int>(input) == INPUT_2 )
return updater<INPUT_2>();
return updater<INPUT_0>();
}
template<const uint8_t In>
static constexpr uint16_t updater() {
if constexpr( In == INPUT_0 ) {
std::cout << "Output updated to: " << OUTPUT_0 << '\n';
return OUTPUT_0;
}
if constexpr( In == INPUT_1 ) {
std::cout << "Output updated to: " << OUTPUT_1 << '\n';
return OUTPUT_1;
}
if constexpr( In == INPUT_2 ) {
std::cout << "Output updated to: " << OUTPUT_2 << '\n';
return OUTPUT_2;
}
}
};
如果我在编译时知道值时使用函数模板本身:
#include <iostream>
int main() {
auto output0 = Foo::updater<Foo::INPUT_0>();
auto output1 = Foo::updater<Foo::INPUT_1>();
auto output2 = Foo::updater<Foo::INPUT_2>();
std::cout << "\n--------------------------------\n";
std::cout << "Output0: " << output0 << '\n'
<< "Output1: " << output1 << '\n'
<< "Output2: " << output2 << '\n';
return 0;
}
我得到正确的输出:
-输出-
Output updated to: 123
Output updated to: 234
Output updated to: 345
---------------------------------
Output0: 123
Output1: 234
Output2: 345
然而,当我在运行时确定值时尝试使用非 constexpr 成员函数时,出于某种原因,非 constexpr 函数无法执行 if 语句中的代码。
#include <iostream>
int main() {
uint8_t input;
std::cout << "Please enter input value [0,2]\n";
std::cin >> input;
auto output = Foo::update( input );
std::cout << "Output: " << output << '\n';
return 0;
}
无论我从键盘输入什么值,0
、1
或 2
,都无法执行 Foo::update()'s
if 语句中的代码。它总是打印出 123
的值。
如果有帮助;我正在使用 Visual Studio 2017 CE v15.9.4
并在编译时将语言设置为 ISO C++ Latest Draft Standard (/std:c++latest)
.
我不知道为什么此代码无法将 if statements
评估为 true 并在其范围内调用代码。
input
正在接收一个 char
,因此它将被设置为输入字符的 ASCII 值。例如。输入 2
会将 input
设置为 50。
下次,使用调试器来确定您的程序逻辑哪里出错了。您本可以轻松地自己找到问题的解决方案。
我有一个基本的 class,它包含两个枚举器,一个用于输入,一个用于输出。它有两个成员函数,都是静态的。第一个函数只是一个静态函数,return 是一个基于输入的值。它将调用第二个函数,该函数是一个 constexpr 函数模板,它将 return constexpr 值。您可以在此处查看完整的 class。
class Foo {
public:
enum Input {
INPUT_0 = 0,
INPUT_1,
INPUT_2
};
enum Output {
OUTPUT_0 = 123,
OUTPUT_1 = 234,
OUTPUT_2 = 345
};
static uint16_t update( uint8_t input ) {
if ( static_cast<int>(input) == INPUT_0 )
return updater<INPUT_0>();
if ( static_cast<int>(input) == INPUT_1 )
return updater<INPUT_1>();
if ( static_cast<int>(input) == INPUT_2 )
return updater<INPUT_2>();
return updater<INPUT_0>();
}
template<const uint8_t In>
static constexpr uint16_t updater() {
if constexpr( In == INPUT_0 ) {
std::cout << "Output updated to: " << OUTPUT_0 << '\n';
return OUTPUT_0;
}
if constexpr( In == INPUT_1 ) {
std::cout << "Output updated to: " << OUTPUT_1 << '\n';
return OUTPUT_1;
}
if constexpr( In == INPUT_2 ) {
std::cout << "Output updated to: " << OUTPUT_2 << '\n';
return OUTPUT_2;
}
}
};
如果我在编译时知道值时使用函数模板本身:
#include <iostream>
int main() {
auto output0 = Foo::updater<Foo::INPUT_0>();
auto output1 = Foo::updater<Foo::INPUT_1>();
auto output2 = Foo::updater<Foo::INPUT_2>();
std::cout << "\n--------------------------------\n";
std::cout << "Output0: " << output0 << '\n'
<< "Output1: " << output1 << '\n'
<< "Output2: " << output2 << '\n';
return 0;
}
我得到正确的输出:
-输出-
Output updated to: 123
Output updated to: 234
Output updated to: 345
---------------------------------
Output0: 123
Output1: 234
Output2: 345
然而,当我在运行时确定值时尝试使用非 constexpr 成员函数时,出于某种原因,非 constexpr 函数无法执行 if 语句中的代码。
#include <iostream>
int main() {
uint8_t input;
std::cout << "Please enter input value [0,2]\n";
std::cin >> input;
auto output = Foo::update( input );
std::cout << "Output: " << output << '\n';
return 0;
}
无论我从键盘输入什么值,0
、1
或 2
,都无法执行 Foo::update()'s
if 语句中的代码。它总是打印出 123
的值。
如果有帮助;我正在使用 Visual Studio 2017 CE v15.9.4
并在编译时将语言设置为 ISO C++ Latest Draft Standard (/std:c++latest)
.
我不知道为什么此代码无法将 if statements
评估为 true 并在其范围内调用代码。
input
正在接收一个 char
,因此它将被设置为输入字符的 ASCII 值。例如。输入 2
会将 input
设置为 50。
下次,使用调试器来确定您的程序逻辑哪里出错了。您本可以轻松地自己找到问题的解决方案。