我想这样写:
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
。有办法解决这个问题吗?
我认为这需要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;
演示
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;
演示
不要使用维基百科上的疯狂东西。
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,所以在此上
基本上,我想实现一个类型。但这个问题不是关于如何做到这一点的详细信息,而是如何设置东西,以便我的新flat16类型在浮动、双精度和所有整数类型中表现适当。 我希望我的< code>float16类型能够类似地转换为float或double。例如,它应该隐式转换为这两种类型。它还应该有STD::common _ type(http://en.cppreference.com/w/cpp/types/
我正在尝试访问res/stringsxml中的字符串值: 编辑:在onCreate()中初始化 不管用