繁体   English   中英

在 constexpr 中传递参数包

[英]Passing parameter pack in constexpr

我试图在编译时确定所有传递对象的大小,然后在超过最大大小时通过 static_assert 中止构建过程。

#include <iostream>

template<class T>
class Test
{
public:
    T value;
    constexpr size_t size() const { return sizeof(T) + 3; }
};

template<typename ...T>
constexpr int calc(const T&...args)
{
    return (args.size() + ...);
}

template<typename ...T>
void wrapper(const T& ...args)
{
    // error: 'args#0' is not a constant expression
    constexpr int v = calc(args...);
    static_assert(v <= 11, "oops"); 
}

int main()
{
    Test<int> a;
    Test<char> b;
    // a.size() + b.size() == 11

    // works
    constexpr int v = calc(a, b);
    static_assert(v <= 11, "oops"); 

    // wrapper function
    wrapper(a, b);  
}

在上帝螺栓上运行

如果我直接用对象调用计算函数,它就可以完美地工作。 但是如果我使用包装函数并传递参数包,突然参数似乎不再是恒定的。 有谁知道我该如何解决这个问题?

函数参数不是constexpr表达式(有充分的理由),即使是constexprconsteval函数的一部分。

如果您愿意使Test::size静态,独立于对象:

#include <iostream>

template<class T>
class Test
{
public:
    T value;
    constexpr static size_t size() { return sizeof(T) + 3; }
};

template<typename ...T>
constexpr size_t calc_types()
{
    return (T::size() + ...);
}

template<typename ...T>
constexpr size_t calc_vals(const T&...)
{
    return calc_types<T...>();
}


template<typename ...T>
constexpr void wrapper_types()
{
    static_assert(calc_types<T...>() <= 11, "oops"); 
}

template<typename ...T>
constexpr void wrapper_vals(const T&...)
{
    wrapper_types<T...>();    
}


int main()
{
    Test<int> a;
    Test<char> b;
    // a.size() + b.size() == 11

    // works
    constexpr int v = calc_vals(a, b);
    static_assert(v <= 11, "oops"); 

    // wrapper function
    wrapper_vals(a, b);  
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM