gpt4 book ai didi

c++ - 关于特定类容器参数化的模式匹配/SFINAE?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:16:34 25 4
gpt4 key购买 nike

我有 Base类和一些Derived类。来自外部代码的某些位模式可以制作这些,并且有构建它们的通用代码。该通用代码必须使用显式模板“工厂”:

auto d = factory<D>(data); // where D is some Derived class

这个工厂为从 Base 派生的类启用了 SFINAE:

template<
class T,
typename = typename std::enable_if<
std::is_base_of<Base, T>::value
>::type
>
T factory(ExternalData &data) {
T result;
if (!result.initFromData(&data))
throw std::runtime_error("data is not set");
return result;
}

我想添加另一个适用于 std::experimental::optional<Derived> 的变体对于位模式指示事物未设置的情况。在这种情况下,通用代码将传入任一类型:

auto dod = factory<DOD>(data); // DOD can be Derived or std::optional<Derived>

使用这样的显式参数化,我将如何创建另一个 SFINAE 变体,该变体将“模式匹配”到仅针对 std::experimental::optional<any class whose base is Base> 的存在?

我的愿望是,如果我能写:

template<
std::experimental::optional<class T>, // imaginary
typename = typename std::enable_if<
std::is_base_of<Base, T>::value
>::type
>
std::optional<T> factory(ExternalData &data) {
T result;
if (!result.initFromData(&data))
return nullopt;
return result;
}

是否有实现愿望的非虚构版本?我看了"using SFINAE for template class specialisation" (以及其他几个)似乎有一些方法可以合作破解一些东西,如果我写的话用一个容器来完成它(?),但我是否错过了一个简单的答案?

最佳答案

#include <type_traits>

template <typename T>
struct extract_optional;

template <typename T>
struct extract_optional<std::experimental::optional<T>>
{
using type = T;
};

template <typename T>
using extract_optional_t = typename extract_optional<T>::type;

template <
typename T,
typename OP = extract_optional_t<T>,
typename = typename std::enable_if<
std::is_base_of<Base, OP>::value
>::type
>
std::experimental::optional<OP> factory(ExternalData &data) {
OP result;
if (!result.initFromData(&data))
return nullopt;
return result;
}

DEMO

关于c++ - 关于特定类容器参数化的模式匹配/SFINAE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32859415/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com