Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;bool模板避免if语句_C++_Templates_If Statement_Boolean - Fatal编程技术网

C++ c++;bool模板避免if语句

C++ c++;bool模板避免if语句,c++,templates,if-statement,boolean,C++,Templates,If Statement,Boolean,在处理模板bool函数时,我正在寻找一种避免if语句的方法。 下面的代码显示了我的情况的简化 #include <iostream> #include <string> template<bool var> void f(){ std::cout << (var ? "TRUE" : "FALSE") << std::endl; } int main(int argc, char* argv[]){ const bool

在处理模板bool函数时,我正在寻找一种避免if语句的方法。
下面的代码显示了我的情况的简化

#include <iostream>
#include <string>

template<bool var>
void f(){
 std::cout << (var ? "TRUE" : "FALSE") << std::endl;
}

int main(int argc, char* argv[]){
    const bool b = (std::string(argv[1]).compare("TRUE") == 0);
    if (b) f<true>();
    else f<false>();
    return 0;   
}
有办法吗?是否存在我可以以某种方式使用的快捷方式?

我还尝试使用if语句快捷方式
f()
但是我收到了上面显示的相同错误。

我想我理解你想要做什么。您需要一个查找表,它接受一组开/关标志并运行模板的特定实例化

这是可能的,但有点超出了快速回答所能做到的。你需要一些适度的元编程。我的出发点是:

  • 实现一个元程序,创建一组n个标志的排列
  • 实现一个constexpr函数,该函数将一系列标志转换为位掩码。您将在运行时和编译时使用它
  • 实现一个元程序,它将根据bool标志为您提供一个指向实例化的函数指针
  • 实现元程序/constexpr函数,该函数生成由位掩码索引的指针数组
  • 在运行时使用布尔值调用
  • 它可能需要几个小时才能实现,但应该不会那么难

    您最初的问题似乎期望的是将运行时值转换为编译时值,这根本不可能。但是您可以实现一个跳转表,这样您就不必自己手工编写每个排列。你应该问问自己,这是否真的值得,因为最终结果将更难维持,特别是如果你的团队中有很多初级开发人员——我现在假设你是这样。很多高级开发人员看到这种情况也会大发雷霆


    哦,你不一定会看到任何性能改进。个人资料,不要假设。

    我想我知道你想做什么。您需要一个查找表,它接受一组开/关标志并运行模板的特定实例化

    这是可能的,但有点超出了快速回答所能做到的。你需要一些适度的元编程。我的出发点是:

  • 实现一个元程序,创建一组n个标志的排列
  • 实现一个constexpr函数,该函数将一系列标志转换为位掩码。您将在运行时和编译时使用它
  • 实现一个元程序,它将根据bool标志为您提供一个指向实例化的函数指针
  • 实现元程序/constexpr函数,该函数生成由位掩码索引的指针数组
  • 在运行时使用布尔值调用
  • 它可能需要几个小时才能实现,但应该不会那么难

    您最初的问题似乎期望的是将运行时值转换为编译时值,这根本不可能。但是您可以实现一个跳转表,这样您就不必自己手工编写每个排列。你应该问问自己,这是否真的值得,因为最终结果将更难维持,特别是如果你的团队中有很多初级开发人员——我现在假设你是这样。很多高级开发人员看到这种情况也会大发雷霆


    哦,你不一定会看到任何性能改进。配置文件,不要假设。

    您可能需要以下内容:

    template <bool b1, bool b2, bool b3, bool b4>
    void f()
    {
        // Your method.
        std::cout << b1 << b2 << b3 << b4 << std::endl;   
    }
    
    template <std::size_t...Is>
    void call_f_helper(int i, std::index_sequence<Is...>)
    {
        using f_t = void();
        f_t* fs[] = {&f<(Is >> 0) & 1, (Is >> 1) & 1, (Is >> 2) & 1, (Is >> 3) & 1>...};
    
        fs[i]();
    }
    
    // The runtime dispather
    void call_f(bool b1, bool b2, bool b3, bool b4)
    {
        call_f_helper(b1 << 0 | b2 << 1 | b3 << 2 | b4 << 3, std::make_index_sequence<16>());  
    }
    
    模板
    void f()
    {
    //你的方法。
    std::cout 2)&1,(Is>>3)&1>};
    fs[i]();
    }
    //运行时dispather
    无效调用(布尔b1、布尔b2、布尔b3、布尔b4)
    {
    
    打电话给您的助手(b1您可能需要以下内容:

    template <bool b1, bool b2, bool b3, bool b4>
    void f()
    {
        // Your method.
        std::cout << b1 << b2 << b3 << b4 << std::endl;   
    }
    
    template <std::size_t...Is>
    void call_f_helper(int i, std::index_sequence<Is...>)
    {
        using f_t = void();
        f_t* fs[] = {&f<(Is >> 0) & 1, (Is >> 1) & 1, (Is >> 2) & 1, (Is >> 3) & 1>...};
    
        fs[i]();
    }
    
    // The runtime dispather
    void call_f(bool b1, bool b2, bool b3, bool b4)
    {
        call_f_helper(b1 << 0 | b2 << 1 | b3 << 2 | b4 << 3, std::make_index_sequence<16>());  
    }
    
    模板
    void f()
    {
    //你的方法。
    std::cout 2)&1,(Is>>3)&1>};
    fs[i]();
    }
    //运行时dispather
    无效调用(布尔b1、布尔b2、布尔b3、布尔b4)
    {
    
    调用_f_helper(b1)如果它们真的是可变参数,请为作业使用正确的工具,而不是模板参数。argv在运行时已知,b必须在编译时已知,因此您陷入困境。使b const没有任何好处。是的,但不存在一种优雅的方式来写下它吗?
    f(b)有什么问题
    ?这是在做优化错误。首先,您试图使用编译时计算来优化测试运行时值。这是行不通的。您需要在代码中的某个地方测试该变量。其次,避免这种假设的性能损失不值得让您的代码不可读。第三,不要再担心它了!optimizer和branch predictor将一起完成一项非常出色的工作,确保运行时初始化的常量不会在每次测试时都受到惩罚。如果您不相信我,请编译一些测试用例并亲自查看!如果它们确实是可变参数,请使用正确的工具,而不是模板参数。argv是已知的在运行时,b必须在编译时被知道,所以你被卡住了。使b常量不会有任何好处。是的,但没有一种优雅的方式来写它?f(b)有什么问题
    ?这是在做优化错误。首先,您试图使用编译时计算来优化测试运行时值。这是行不通的。您需要在代码中的某个地方测试该变量。其次,避免这种假设的性能损失不值得让您的代码不可读。第三,不要再担心它了!optimizer和branch predictor将一起完成一项非常出色的工作,确保运行时初始化的常量不会在每次测试时都受到惩罚。如果你不相信我,请编译一些测试用例,自己看看吧!“这是可能的,但有点超出了快速回答所能做到的。”-哇。谁想出了这个主意,堆栈溢出是写一些快速的,递给我代表已经回答了吗?“这是可能的,但有点超出了快速回答所能做的。”-哇。谁c