C++ 创建一个类似std::integral\u常量的容器

C++ 创建一个类似std::integral\u常量的容器,c++,c++11,c++14,variadic-templates,constexpr,C++,C++11,C++14,Variadic Templates,Constexpr,我想创建std::integral\u constant的“容器版本”。即使用元素类型和非类型参数参数参数化的类型: 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... T

我想创建
std::integral\u constant
的“容器版本”。即使用元素类型和非类型参数参数参数化的类型:

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

有什么提示吗?

您的问题是没有将函数的参数传递给创建返回值的模板参数列表

template<typename T, T... Ts>
constexpr auto make_static_container(T... /* !!! unused values !!! */) { // wrong
    return static_container<T, Ts...>{};
}
这就是零值

您应该能够使用函数的参数,并将它们作为模板而不是类型参数传递;差不多

template<typename T0, typename ... Ts>
constexpr auto make_static_container (T0 const t0, Ts const ... ts)
 { return static_container<T0, t0, ts...>{}; }
模板
constexpr自动生成静态容器(T0 const T0,Ts const…Ts)
{返回静态_容器{};}

但这在C++11/C++14中是不可能的(据我所知),因为
t0
/
ts
值不是
constepr
值,下面是您关于
std::integral_constant
的评论:

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


(顺便说一句,演示中单独定义了
static_container::value

您遇到了什么错误以及使用什么编译器?在VS2015上编译抱歉,这里不清楚:没有编译错误,但“container”是空的。是的,这确实不可能,由于constexpr函数也必须在非constexpr上下文中可调用。我想知道是否有一种解决方案,可以使用std::integral_常量作为make_static_容器的模板参数,并使用make_static_容器的显式实例化而不是参数列表。。。。但我做得不对。模板变量的想法很有趣。@wimalopaan:直到最近我才对它们有任何看法或使用,但最近的使用给了我新的视角。:-]
template<typename T0, typename ... Ts>
constexpr auto make_static_container (T0 const t0, Ts const ... ts)
 { return static_container<T0, t0, ts...>{}; }
template<typename T, T... Values>
constexpr auto make_static_container(std::integral_constant<T, Values>...) noexcept {
    return static_container<T, Values...>{};
}
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);
}