C++ c++;bool模板避免if语句
在处理模板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
下面的代码显示了我的情况的简化
#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