如果语句无法评估条件

时间:2019-01-11 23:27:30

标签: templates if-statement c++17 constexpr static-functions

我有一个基本类,其中包含两个枚举器,一个枚举用于输入,一个枚举用于输出。它具有两个都是静态的成员函数。第一个函数只是一个静态函数,它根据输入返回一个值。它将调用第二个函数,这是一个constexpr函数模板,它将返回constexpr值。您可以在此处查看完整的课程。

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

但是,当我在运行时确定值时尝试使用non constexpr成员函数时,由于某种原因或其他原因,non 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;        
}

无论我从键盘上输入什么值012,它都无法执行if语句在Foo::update()'s中的代码。它始终打印出123的值。

如果有帮助;我正在使用Visual Studio 2017 CE v15.9.4,并使用设置为ISO C++ Latest Draft Standard (/std:c++latest)的语言进行编译。

我不知道为什么这段代码无法将if statements评估为true并在其范围内调用该代码。

1 个答案:

答案 0 :(得分:3)

input正在接收char,因此它将被设置为输入字符的ASCII值。例如。输入2会将input设置为50。

下次,使用调试器来确定您的程序逻辑误入何处。您本可以轻松地自己找到问题的解决方案。