Определение максимального размера Variadi c Экземпляр класса шаблона во время компиляции в C ++ - PullRequest
0 голосов
/ 09 марта 2020

Я хочу определить максимальный размер следующего варианта c экземпляра класса шаблона во время компиляции.

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

I необходимо знать значение MAX_SIZE_FOO_OBJECT, чтобы сделать это во время компиляции. Что я могу сделать, чтобы узнать значение MAX_SIZE_FOO_OBJECT во время компиляции?

1 Ответ

1 голос
/ 09 марта 2020

Это шаблон; если вы не предоставите какое-либо конкретное c ограничение на различные T s, которые могут go в Foo, любой может создать его экземпляр с любым типом, который может быть членом std::tuple и в остальном подходит вашему интерфейсу. Множество T s не ограничено и поэтому неизвестно. Это означает, что любая операция на различных возможных T с (например, вычисление максимального размера) одинаково непостижима.

Вы можете знать это, только если у вас есть некоторый фиксированный, ограниченный набор действительных T с, которые вы намерены использовать. Несмотря на это, вам потребуется много метапрограммирования шаблонов, чтобы вычислить размер каждого Foo экземпляра, созданного для каждой комбинации этого набора T с.

Лучше всего всего этого избежать и что-то сделать гораздо более типичный. Или, если это невозможно, выберите максимальный размер, который вам удобен, и просто static_assert где-нибудь, если кто-то попытается создать экземпляр Foo с типами, которые превышают этот размер.

...