【发布时间】:2022-07-08 20:41:45
【问题描述】:
如果通过任何 std::variant 或任何 boost::variant,我想创建一个具有相同实现的类专业化。我试图玩弄 std::enable_if、std::disjunction 和 std::is_same 但我无法让它编译。这是一个代码示例,用于显示我想要实现的目标。
#include <variant>
#include <iostream>
#include <boost/variant.hpp>
template <typename T>
struct TypeChecker;
template <typename T>
struct TypeChecker<T>
{
void operator()()
{
std::cout << \"I am other type\\n\";
}
}
template <typename ... Ts> // I want to be able to capture Ts... in TypeChecker scope
struct TypeChecker<std::variant<Ts...> or boost::variant<Ts...>> // what to insert here?
{
void operator()()
{
std::cout << \"I am either std::variant or boost::variant\\n\";
}
}
int main()
{
TypeChecker<std::variant<int, float>>{}();
TypeChecker<boost::variant<int, float>>{}();
TypeChecker<int>{}();
}
预期结果:
I am either std::variant or boost::variant
I am either std::variant or boost::variant
I am other type
-
C++ 中没有
or关键字/运算符 -
@JakobStark C++ 中有
orkeyword,它是||的同义词,但如果没有一些元编程,它不能在这里直接使用。 -
@Yksisarvinen 我实际上不知道这一点,以前从未见过。感谢您指出;)
标签: c++ templates metaprogramming variant