C++ 获取 vector 类型

标签 c++ templates vector

我正在使用对象构造的模板函数从反射数据创建对象,它工作得很好,但现在我想在反射系统中支持 STL 容器类型,以便对象如:

// Note - test case only
// for real world usage it would probably not be structured like this 
// and the phrases would be mapped by an id or something 
struct Phrases {
  std::vector<std::string> phrases;
};

typedef std::string Lang;
struct Langs {
  std::map< Lang, Phrases > translations;
};

可以支持。我可以在

返回时做一些正则表达式魔术
typeid( object ).name() 

判断一个对象是 vector 还是 map ,以及对象的参数参数是什么。我已经尝试了一些模板魔术来做类似下面的事情,其中​​ CreateString、ConstructString 和 DestroyString 代表函数,数据代表一些更复杂的东西,使用类型数据库来处理对象构造。

// Representational of code, basically a copy-paste to a different test project where I can work out the problems with this specific vector problem 
// Vector specialised construction 
template <typename T> void ConstructVector( void* object, const std::vector<std::string>& data ) {
  T* vec = (T*)object;
  Name vector_type = GetVectorTypeName<T>();

  void *obj; 
  CreateString(&obj);
  // All fields in this type should be valid objects for this vector 
  for( std::vector<std::string>::const_iterator it = data.begin(), end = data.end(); it != end; ++it ) {
    // Push it 
    vec->push_back(*obj);
    // Get address to new instance 
    void *newly = &vec->back(); 
    ConstructString(newly,*it);
  }
  DestroyString(&obj);

}

由于使用“vec->push_back(*obj);”的非法间接寻址,这不起作用我无法确定,因为我实际上并不知道类型。基本上我需要做的是创建这个 vector ,其中已经有一些空白的未设置元素,或者在没有实际类型的情况下向它添加新元素,因为如果我能得到一个指向 vector 内部内存块的指针,我就可以滚动并构建对象。但是vector添加要求如

vector::push_back( T& value ) 

vector::insert( Iter&, T& ) 

除非我能从模板内部得到那个 T 类型,否则对我不起作用

用于尝试解决此问题的测试代码的 pastebin: http://pastebin.com/1ZAw1VXg

所以我的问题是,当我在像这样的模板中时,如何获取 std::vector 声明的 std::string 部分

template <typename T> void SomeFunc() {

  // Need to get std::string here somehow       
  // Alternatively need to make the vector a certain size and then 
  // get pointers to it's members so I can construct them 
}


SomeFunc<std::vector<std::string>>>();

最佳答案

有两种方法可以做到这一点。

1)要么你利用std::vector<>这个事实(像所有标准库容器类一样)维护一个成员类型 value_type , 表示存储在 vector 中的元素的类型。所以你可以这样做:

template <typename T> void SomeFunc() {
  typename T::value_type s;  // <--- declares a `std::string` object
                             //      if `T` is a `std::vector<std::string>`
}

2) 否则,您更改函数的声明并使用模板模板参数:

template <template <typename> class T, typename Elem>
void SomeFunc(T<Elem> &arg)
{
  Elem s;
}

但是,这有一个小问题:std::vector实际上是一个具有两个参数(元素类型和分配器类型)的模板,这使得使用模板模板参数有点困难并仍然保持语法简单。对我有用的一件事是声明只留下一个模板参数的 vector 类型的别名:

template <typename Elem>
using myvector = std::vector<Elem>;

然后我可以使用SomeFunc像这样:

int main()
{
  myvec<std::string> vec;
  SomeFunc(vec);
}

关于C++ 获取 vector 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12490508/

相关文章:

javascript数组效率

r - R中零一向量的唯一排列

python - 将 linspace 向量发送到函数会使该向量在函数启动之前全部为零

c++ - C++ 中的构造函数可以是抽象的吗?

c++ - 带有未命名参数的私有(private)复制构造函数?

C++-SDL : Limiting framerate issue

c++ - 使用 SFINAE 检查函数是否为 constexpr

node.js - html-webpack-plugin - 如何在不执行 EJS 模板的情况下插入 webpack bundle.js

groovy - Groovy:动态字符串中的变量替换

c++ - 将字符串写入长度超过 4095 个字符的文件