ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 创建一个像std :: integral_constant这样的容器

2019-08-23 22:06:46  阅读:207  来源: 互联网

标签:c c11 c14 variadic-templates constexpr


我想创建一个std :: integral_constant的“容器版本”.这是一个使用element-type和non-type参数进行参数化的类型:

enum class A {
    a = 1 << 0, 
    b = 1 << 1, 
    c = 1 << 2
};

template<typename T, T... Values>
struct static_container final {};

template<typename T, T... Ts>
constexpr auto make_static_container(T...) { // wrong
    return static_container<T, Ts...>{};
}

template<typename F, F... FF>
void inline set(static_container<F, FF...>) {
    std::cout << sizeof... (FF) << std::endl;
}

int main() {
    constexpr static_container<A, A::a, A::b> sc1{}; //ok
    constexpr auto sc2 = make_static_container(A::a, A::c); // not-ok

    set(sc1);    
    set(sc2);    
}

上面你可以看到我可以用explict类型创建sc1.

现在我想要一个辅助函数来创建这样一个类型而不指定(冗余)枚举类型.

这里的输出是:

2
0

任何提示?

解决方法:

作为关于std :: integral_constant的评论的后续内容,这里的内容如下:

template<typename T, T... Values>
constexpr auto make_static_container(std::integral_constant<T, Values>...) noexcept {
    return static_container<T, Values...>{};
}

由于函数现在直接采用std :: integral_constant< T>而不是Ts,因此调用点必须改变;它有点吵闹,但可变模板使它不会太痛苦:

template<A a>
using A_ = std::integral_constant<A, a>;

template<A a>
constexpr A_<a> a_{};

int main() {
    // explicit construction via alias template:
    constexpr auto sc1 = make_static_container(A_<A::a>{}, A_<A::b>{});
    // implicit construction via variable template:
    constexpr auto sc2 = make_static_container(a_<A::a>, a_<A::c>);

    set(sc1);
    set(sc2);
}

Online Demo

(另外,演示becomes unnecessary in C++17中static_container :: value的单独定义.)

标签:c,c11,c14,variadic-templates,constexpr
来源: https://codeday.me/bug/20190823/1701674.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有