在C ++中确定可变参数模板类实例在编译时的最大大小

问题描述 投票:-1回答:1

我想在编译时确定以下可变参数模板类实例的最大大小。

template <typename... T>
class Foo
{
public:

    std::tuple<T...> params;
    void (*func)(T...);

    void save(T...args)
    {
        params=std::make_tuple(args...);
    }

    void call()
    {
        std::apply(func,params);
    }
};

我想按如下方式使用此类:

void testfoo1(int a,double b,double c,double d)
{
    std::cout<<a<<"--"<<b<<c<<d<<std::endl;
}

void testfoo2(int a,double b,double c,double d,int e,long long int f)
{
    std::cout<<a<<"--"<<b<<c<<d<<e<<f<<std::endl;
}
struct FooObject
{
    char buffer[MAX_SIZE_FOO_OBJECT];
};

int main()
{
    std::queue<FooObject> fooObjectBuffer;
    FooObject foo_temp;
    Foo<int,double,double,double> foo1;
    Foo<int,double,double,double,int,long long int> foo2;
    foo1.func=testfoo1;
    foo1.save(5,10.2,5.3,2.7);
    foo2.func=testfoo2;
    foo2.save(1,2,3,4,5,6);
    fooObjectBuffer.push(*reinterpret_cast<FooObject*>(&foo1));
    fooObjectBuffer.push(*reinterpret_cast<FooObject*>(&foo2));

    foo_temp=fooObjectBuffer.front();
    reinterpret_cast<decltype (foo1)*>(&foo_temp)->call();
    fooObjectBuffer.pop();
    fooObjectBuffer.front();
    foo_temp=fooObjectBuffer.front();
    reinterpret_cast<decltype (foo2)*>(&foo_temp)->call();
    fooObjectBuffer.pop();
}

我需要知道MAX_SIZE_FOO_OBJECT的值才能在编译时执行此操作。如何知道编译时的MAX_SIZE_FOO_OBJECT值?

c++ c++17 variadic-templates template-meta-programming
1个回答
0
投票

这是一个模板;除非您对T中可以使用的各种Foo提供一些特定的限制,否则任何人都可以使用可以成为std::tuple成员的任何类型来实例化它,否则将适合您的界面。 T的集合是无界的,因此是不可知的。这意味着对各种可能的T进行的任何操作(例如计算最大大小)都同样不可知。

© www.soinside.com 2019 - 2024. All rights reserved.