我有一个像这样定义的变量
auto drum = std::make_tuple
( std::make_tuple
( 0.3f
, ExampleClass
, [](ExampleClass& instance) {return instance.eGetter ();}
)
);
Run Code Online (Sandbox Code Playgroud)
我希望drum成为元组的元组.(即((a, b, c))).
我有另一个像这样定义的变量
auto base = std::make_tuple
( 0.48f
, ExampleClass
, [](ExampleClass& instance) {return instance.eGetter ();}
);
Run Code Online (Sandbox Code Playgroud)
我希望它只是三元素的元组(即(a, b, c))
我还有一个定义如下的向量
std::vector<std::tuple<std::tuple< float
, ExampleClass
, std::function<float (ExampleClass&)>
>>> listOfInstruments;
Run Code Online (Sandbox Code Playgroud)
现在,如果我添加drum,listOfInstruments我希望没有错误.
事实确实如此 listOfInstruments.push_back(drum);
我预计错误在这里,listOfInstuments.push_back(base);但代码编译得很好.
由于listOfInstruments有'元组元组',不应该只添加'元组'导致一些错误?除非双方()并(())通过被认为是同一类型std::vector.或者我完全错了,还有其他工作在这里吗?
似乎无法弄明白.
更具体地说,我有一些结构的向量
std::vector<SomeStruct> extensions = getThoseExtensions();
Run Code Online (Sandbox Code Playgroud)
wheresomeStructVariable.extensionName返回一个字符串。
我想创建一组extensionName,像这样的std::set<const char*>。
使用一些for循环完成后,过程相当简单,但我想改用std::transformfrom <algorithm>。
std::transform 有四个参数。
1,2。第一个范围(将第一个范围从和转换为)
3 . 第二个范围/插入器(转换第二个范围)
4 . 一个函数
这是我到目前为止
auto lambdaFn =
[](SomeStruct x) -> const char* { return x.extensionName; };
std::transform(availableExtensions.begin(),
availableExtensions.end(),
std::inserter(xs, xs.begin()),
lambdaFn);
Run Code Online (Sandbox Code Playgroud)
因为std::back_inserter在std::set我使用std::inserter(xs, xs.begin()).
问题是我试图在我的 lambda 函数中返回堆栈内存。那么我该如何解决这个问题呢?
奇怪的是,如果我return从函数中删除它就像我期望的那样工作!但我不明白为什么,这让我害怕未来的影响。
编辑:
我使用的几种结构来代替SomeStruct像VkExtensionProperties定义在vulkan_core
typedef struct VkExtensionProperties {
char extensionName[VK_MAX_EXTENSION_NAME_SIZE];
uint32_t specVersion;
} VkExtensionProperties; …Run Code Online (Sandbox Code Playgroud)