加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 处理2个模板参数的最佳方法?

发布时间:2020-12-16 10:05:25 所属栏目:百科 来源:网络整理
导读:假设我有以下形式的模板化函数: templatebool a,bool b,bool cvoid 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");} 现在我有了这个函
假设我有以下形式的模板化函数:

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的8个版本并且只是调用

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");
}

处理这类情况的最佳方法是什么?

解决方法

But what if you have 2+ parameters? You cannot just do:

您可以使用可变参数模板,递归,高阶函数和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

Say that I know that a can vary between 0 and,i.e,32. I would like to do something like:

您可以使用boost :: hana :: make_range生成0 … 32编译时范围(必须在编译时知道边界).然后,您可以使用boost :: hana :: for_each或类似的编译时迭代构造将运行时值转换为std :: integral_constant< int,X>并将类似的技术应用于我上面发布的技术.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读