如何使用boost库中的变体和任何内部工作?在我正在进行的项目中,我目前使用标记的联合.我想使用其他东西,因为C++中的联合不允许您使用带有构造函数,析构函数或重载赋值运算符的对象.
我查询了任何和变体的大小,并用它们做了一些实验.在我的平台中,variant采用其最长可能类型的大小加上8个字节:我认为我只是8字节的类型信息,其余的是存储值.另一方面,任何只需要8个字节.由于我在64位平台上,我猜任何只是一个指针.
怎么知道它有什么类型?Variant如何通过模板实现它的功能?在使用它们之前,我想更多地了解这些类.
关于以下模板函数,这是关于此问题中的代码的无关问题.
template <class T>
class Object : public Container {
public:
T& object;
Object(const T& obj) : object(obj) {}
};
Run Code Online (Sandbox Code Playgroud)
这是调用构造函数的代码:
template <class T>
void Array::add_element(const T& element)
{
vec.push_back(new Object<T>(element));
}
Run Code Online (Sandbox Code Playgroud)
这段代码编译得很好,但是只要我添加一行就main可以调用它:
Array array;
int i = 3;
array.add_element(i);
Run Code Online (Sandbox Code Playgroud)
我收到编译器警告:error: invalid initialization of reference of type 'int&' from expression of type 'const int'.
那是什么?我通过了int.它不应该自动转为const int&我吗?为什么编译器会抱怨?
在尝试更轻松地访问存储类之后,我最终遇到了一些我不太了解的情况.并且,找到试图与我做同样事情的人并不容易.
我正在尝试做的是,有一个类在内部存储一个值数组作为字符串,但允许从用户端进行简单的类型转换.我计划做的是使用数组下标运算符返回他们通过模板指定的任何类型.虽然,它听起来比它在实践中的效果好很多.这是我正在做的一个简单示例,让您了解它应该如何工作.
class StringList
{
public:
template <typename T>
T operator[](const int i)
}
Run Code Online (Sandbox Code Playgroud)
从那里,我将定义一些特定的模板,任何用户都可以很容易地定义更多,如果需要.但是,最大的问题是,我不知道如何使用模板调用下标运算符.起初我假设以下(显然不正确),考虑它类似于调用模板方法的标准方法.
StringList list;
T var = list<T>[0];
Run Code Online (Sandbox Code Playgroud)
有谁知道调用下标运算符作为模板的正确方法?或者,我应该避免这样做,并使用命名方法?
是否可以定义一个类,它不是类模板,并且可以存储(例如在构造时)对任何特定类型的引用并稍后通过 getter 方法检索它?
struct Wrapper {
template<typename T> Wrapper(const T& t): t_(t);
// How to store the reference??
};
Run Code Online (Sandbox Code Playgroud)
Boost::variant当然不是解决方案,因为它是作为类模板实现的。而且我没有 RTTI。(在HPC环境下,性能就是一切!)
该getter()应能记住的类型。这样auto以后就可以使用了。