当前位置: 首页 > 知识库问答 >
问题:

如何访问C11中可能不存在的类型别名?

张和豫
2023-03-14

我想这样写:

template <class T>
using MyTypeOrTupple = typename std::conditional<has_member_type_MyType<T>::value,
                                                 typename T::MyType,
                                                 std::tuple<> >::type;

我使用https://en.wikibooks.org/wiki/More_C++_惯用语/成员检测器

然而,GCC(4.8.4)仍然抱怨在T中未定义MyType时使用T::MyType。有办法解决这个问题吗?

共有3个答案

童琪
2023-03-14

我认为这需要2级间接:

template<typename ...>
struct void_type
{
    using type = void;
};

template<typename ...T>
using void_t = typename void_type<T...>::type;

#define HAS_TYPE(NAME) \
template<typename, typename = void> \
struct has_type_##NAME: std::false_type \
{}; \
template<typename T> \
struct has_type_##NAME<T, void_t<typename T::NAME>>: std::true_type \
{}

HAS_TYPE(MyType);

template<typename T, bool = has_type_MyType<T>::value>
struct MyTypeOrTupple_impl;

template<typename T>
struct MyTypeOrTupple_impl<T, true>
{ using type = typename T::MyType; };

template<typename T>
struct MyTypeOrTupple_impl<T, false>
{ using type = std::tuple<>; };

template<typename T> using MyTypeOrTupple = typename MyTypeOrTupple_impl<T>::type;

演示

时浩波
2023-03-14
template <typename...>
struct voider { using type = void; };

template <typename... Ts>
using void_t = typename voider<Ts...>::type;

template <typename, typename = void_t<>>
struct MyTypeOrTupple { using type = std::tuple<>; };

template <typename T> 
struct MyTypeOrTupple<T, void_t<typename T::MyType>> { using type = typename T::MyType; };

template <typename T>
using MyTypeOrTupple_t = typename MyTypeOrTupple<T>::type;

演示

习高格
2023-03-14

不要使用维基百科上的疯狂东西。

template <class T>
using MyType_t = typename T::MyType;

template<class T> 
using MyTypeOrTuple = detected_or_t<std::tuple<>, MyType_t, T>;

其中,detected_或_t是来自library fundamentals TS v2的std::experimental::detected_或_t,可按如下方式实现:

namespace detail {

    template<class...> struct voidify { using type = void; };
    template<class...Ts> using void_t = typename voidify<Ts...>::type;

    template <class Default, class AlwaysVoid,
              template<class...> class Op, class... Args>
    struct detector {
      using value_t = std::false_type;
      using type = Default;
    };

    template <class Default, template<class...> class Op, class... Args>
    struct detector<Default, void_t<Op<Args...>>, Op, Args...> {
      using value_t = std::true_type;
      using type = Op<Args...>;
    };

} // namespace detail

template <class Default, template<class...> class Op, class... Args>
using detected_or = detail::detector<Default, void, Op, Args...>;

template< class Default, template<class...> class Op, class... Args >
using detected_or_t = typename detected_or<Default, Op, Args...>::type;
 类似资料:
  • 我一直在尝试在SpringMVC中使用thymeleaf布局方言,如中所述https://github.com/ultraq/thymeleaf-layout-dialect.我的springservlet如下所示 我已将所有模板文件保存在/WEB-INF/templates/中。当我在thymeleaf中使用以下代码创建和使用诱惑时 我发现以下错误: 如果我不布局:decorator=“layo

  • 我的主班里有一个学生班。Student类包含Id和名称。在我的主要班级里,我正在把这三个学生加到名单上。现在我需要取名字不应该为空的第一个学生。为此,我使用了java stream()类,其中包含findFirst()方法来获取第一个匹配值。因此返回类型是可选的。 这是我写的 我该怎么整改呢?

  • 问题内容: 出于教育目的,我尝试制作一个服务器和一个客户端,其中服务器从多个客户端接收数据并回显每条消息。问题是,当我尝试让服务器一次将回显发送到所有客户端时。 我搜寻并回答了许多类似的问题,但是没有一个对我有帮助。希望你能指出我的错误。提前致谢。 问题答案: 您的嵌套类需要外部类的一个实例,因为它不是静态的-但你不 具备 外部类的一个实例。 尝试制作两个嵌套类。看起来他们无论如何都不 需要 引用

  • 不工作的Kotlin代码如下所示: 我省略了(我相信)没有必要重现这个问题的代码。 Kotlin代码实际上是编译的,但在运行时,它在线程“main”java.lang.IllegalAccesserRor中抛出访问类foo.bar.utils.foo$bar$qux。当悬停在上时,IntelliJ显示一个提示,提示中定义了:public/*package*/open class Qux,所以在此上

  • 我正在尝试访问res/stringsxml中的字符串值: 编辑:在onCreate()中初始化 不管用

  • 我使用包来做并行非负矩阵分解,即X=WH。我使用类中的方法。如下面描述中所提到的,所得矩阵存储在中。 在包的GitHub页面中,类是 你能解释一下如何从这个类中提取信息吗? 为了方便起见,我还把笔记本放在这里的Colab上。