gpt4 book ai didi

c++ - 如何定义依赖于模板参数的 typedef 的 typedef

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:03:36 27 4
gpt4 key购买 nike

我想制作一个 typedef,它依赖于模板参数中 typedef 的存在:

struct foo
{
using MyType = int;
};

template <typename T = foo>
struct bar
{
// Pseudo code
#if T::MyType is defined
using MyType = T::MyType;
#else
using MyType = double;
#endif
};

有没有办法让它在 C++14 中使用 std::conditional 或其他东西工作?

最佳答案

有一点 sfinae。

template<class, typename Fallback, typename = void>
struct type_or_default {
using type = Fallback;
};

template<class C, typename F>
struct type_or_default<C, F, std::void_t<typename C::type>> {
using type = typename C::type;
};

这使用模板元函数公开成员名称 type 的标准约定,但您可以根据自己的命名需要对其进行调整。这里唯一的非 C++14 位是 std::void_t,但可以在 C++14 中实现等效的东西(它不能放入命名空间 std)。您可以像这样在类里面使用它:

template <typename T = foo>
struct bar
{
using type = typename type_or_default<T, double>::type;
};

这里发生的是编译器在选择模板特化时进行模式匹配。如果类 C 有一个成员 type,那么我们提供的部分特化将被认为更特化,并因此被选择。否则(如果在检查特化时替换失败),主模板总是在那里可以回退。

Live program去修补。

关于c++ - 如何定义依赖于模板参数的 typedef 的 typedef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55022057/

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