是否有一个 std::variant 包含所有变体

Ben*_*ler 7 c++ templates

我正在寻找一个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)