从vector<variant<T1,T2>> vec
起,我有一个T1& elem
,它在vec
中。我想找到索引i
,使得get<T1>(vec[i])
为elem
。
但是我不确定这是否合法:
auto const p = static_cast<std::variant<T1,T2> const*>(&elem); // 1
auto const i = static_cast<std::size_t>(p - vec.data()); // 2
我不确定// 1
中的静态强制转换是否合法,即使holds_alternative<T1>(vec[i])
成立。
编辑:从下面的讨论中,这个问题可以归结为:我如何以符合标准的方式来行1
?
不确定,如果我完全理解您的问题。
但是您可以使用std::find_if
和std::distance
。
要搜索的变量的类型可以通过decltype
找到。
请参见下面的示例
#include <iostream>
#include <vector>
#include <variant>
#include <algorithm>
#include <iterator>
int main() {
// Some test data
std::vector<std::variant<std::string, int>> vsoi{ "Str1", 1, 2, "Str2", 3, "Str4", "Str5", "Str6" };
// Value to find:
int thingToFind = 3;
//std::string thingToFind = "Str1";
// Get index
size_t pos = std::distance(vsoi.begin(),
std::find_if(vsoi.begin(), vsoi.end(),
[&thingToFind](std::variant<std::string, int>& si) {
return ( std::holds_alternative<decltype(thingToFind)>(si) &&
(std::get<decltype(thingToFind)>(si) == thingToFind)); }));
// Show result
std::cout << pos << "\n";
return 0;
}