c – 处理2个模板参数的最佳方法?
假设我有以下形式的模板化函数:
template<bool a,bool b,bool c> void foo(){ if(a) printf("I do something when a is true!n"); if(b) printf("I do something when b is true!n"); if(c) printf("I do something when c is true!n"); } 现在我有了这个函数,它可以是专门针对8种可能情况中的每一种的编译时间(a = b = c = true,a = b = true c = false等等). 我想在运行时获得的a,b和c值调用此函数. 如果模板只有一个参数我可以做: void caller(bool a){ if(a) foo<true>(); else foo<false>(); } 但是,如果你有2个参数怎么办?你不能只做: void caller(bool a,bool c){ foo<a,b,c>(); } 如果你使用if-else / switch进行这种麻烦的疯狂是不可取的. foo<a,c>() 如果相反bool,我可以做同样的情况: template<int a> void foo(){ printf("%d",a); } 假设我知道a可以在0和32之间变化. void caller(int a){ if(a<=32 && a>0) foo<a>(); else printf("ERROR!/n"); } 处理这类情况的最佳方法是什么? 解决方法
您可以使用可变参数模板,递归,高阶函数和std :: integral_constant: template <typename TF> auto with_bool_constant(TF xf) { return xf(); }; template <typename TF,typename T,typename... Ts> auto with_bool_constant(TF xf,T x,Ts... xs) { if(x) return with_bool_constant([&](auto... ys) { xf(std::integral_constant<bool,true>{},ys...); },xs...); else return with_bool_constant([&](auto... ys) { xf(std::integral_constant<bool,false>{},xs...); }; 用法: template <bool a,bool c> void f() { std::cout << std::boolalpha << a << " " << b << " " << c << "n"; } int main() { auto f_wrapper = [](auto a,auto b,auto c) { return f<a,c>(); }; with_bool_constant(f_wrapper,true,false,true); } wandbox example
您可以使用boost :: hana :: make_range生成0 … 32编译时范围(必须在编译时知道边界).然后,您可以使用boost :: hana :: for_each或类似的编译时迭代构造将运行时值转换为std :: integral_constant< int,X>并将类似的技术应用于我上面发布的技术. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |