我正在寻找一个std::variant包含所有类型而不是其中一种类型的类。
所以我希望能够写:
std::all_variant<int, double> av{1, 3.14159};
int i = std::get<int>(av); // i should be 1.
double d = std::get<double>(av); // d should be 3.14159
Run Code Online (Sandbox Code Playgroud)
这基本上是一个tuple但保证每个类型只出现一次所以你可以std::get<Type>代替std::get<Index>.
对于上下文,我希望能够编写以下代码(因此,如果有更好的方法,我将不胜感激):
std::all_variant<int, double> av{1, 3.14159};
template <typename T> // T must be either int or double.
void MyFunc(std::all_variant<int, double> av) {
std::cout << std::get<T>(av);
}
int main() {
MyFunc<int>(av); // Should print 1.
MyFunc<double>(av); // Should print 3.14159.
MyFunc<std::string>(av); // Error! av doesn't have std::string variant.
}
Run Code Online (Sandbox Code Playgroud)
我不确定这会叫什么,所以我不确定这是否在标准库中。我想写一个并不难,但我不想重新发明轮子。
Sla*_*ica 11
我正在寻找一个类似于 std::variant 的类,它包含所有类型而不是其中一种类型。
你要找的东西叫做 std::tuple
std::tuple<int,double> mytup( 1, 2.0 );
std::cout << std::get<int>( mytup ) << "\n"; // prints 1
std::cout << std::get<double>( mytup ) << "\n"; // prints 2
std::cout << std::get<std::string>( mytup ) << "\n"; // compiler error
Run Code Online (Sandbox Code Playgroud)
至于单一类型的外观要求,当您尝试使用重复类型std::get<type>代替索引时,您会得到编译错误std::tuple。(感谢@max66)