【发布时间】:2019-03-26 00:18:31
【问题描述】:
我需要在编译时对变体类型是否可以保存类型进行类型检查。
我正在将枚举和字符串转换为变体,但我希望库与用户提供的变体兼容(对于它们支持的类型)。所以我有一个模板参数CustomVariant 来表示受支持类型子集AlphaBeta、Gamma、Delta 和Epsilon 的变体。如果我无法创建有效的变体,我想返回 std::nullopt。
template <typename CustomVariant>
std::optional<CustomVariant> AsCustomVariant(LargeEnum type, const std::string& name) {
case LargeEnum::ALPHA:
case LargeEnum::BETA:
return ConvertAlphaBeta(name);
case LargeEnum::GAMMA:
return ConvertGamma(name);
case LargeEnum::DELTA:
return ConvertDelta(name);
case LargeEnum::EPSILON:
return ConvertEpsilon(name);
default:
return std::nullopt;
}
我们的想法是使用某种模板魔法,它可以执行以下操作:
if (std::type_can_convert<CustomVariant, Gamma>) {
return ConvertGamma(name);
} else {
return std::nullopt;
}
【问题讨论】:
-
什么是 CustomVariant?它是标准变体吗? Gamma 是一种类型吗?如果 tha 变体 hokds 一个可以转换的类型 - 从 ConvertGamma 的 reyurn 类型,那足够好,还是只有完全匹配?如果是第一个,什么样的排序?你的 switch 语句在哪里,它似乎丢失了。 LargeEnum 是连续的吗?
-
您正在寻找的模板魔法是
if constexpr (std::is_convertible_v<Gamma, CustomVariant>)。
标签: c++ c++11 templates variant