我想在编译时确定以下可变参数模板类实例的最大大小。
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值?
这是一个模板;除非您对T
中可以使用的各种Foo
提供一些特定的限制,否则任何人都可以使用可以成为std::tuple
成员的任何类型来实例化它,否则将适合您的界面。 T
的集合是无界的,因此是不可知的。这意味着对各种可能的T
进行的任何操作(例如计算最大大小)都同样不可知。