- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我试图检测成员函数 baz()
的存在在模板参数中:
template<typename T, typename = void>
struct ImplementsBaz : public std::false_type { };
template<typename T>
struct ImplementsBaz<T, decltype(&T::baz)> : public std::true_type { };
但它总是产生错误:
struct Foo {};
struct Bar { void baz() {} };
std::cout << ImplementsBaz<Foo>::value << std::endl; // 0
std::cout << ImplementsBaz<Bar>::value << std::endl; // also 0
使用 declval
不过,调用该方法确实有效:
template<typename T>
struct ImplementsBaz<T, decltype(std::declval<T>().baz())> : public std::true_type { };
当然,现在这个只能检测一个baz
具有 0 个参数的函数。 为什么在使用declval<T>().baz()
时选择的专业是正确的? , 但不是 decltype(&T::baz)
?
最佳答案
如果您使用 void_t
“检测成语”,然后它确实按预期工作:
template <typename...> using void_t = void;
template <typename T>
struct ImplementsBaz<T, void_t<decltype(&T::baz)>> : std::true_type {};
struct Bar { void baz() {} };
static_assert(ImplementsBaz<Bar>::value); // passes
至于为什么,this question详细解释了“void_t
技巧”是如何工作的。引用已接受的答案:
It's as if you had written
has_member<A, void>::value
. Now, the template parameter list is compared against any specializations of the templatehas_member
. Only if no specialization matches, the definition of the primary template is used as a fall-back.
在原来的情况下,decltype(&T::baz)
不是 void
,所以特化与原始模板不匹配,因此不予考虑。我们需要使用 void_t
(或其他一些机制,例如强制转换)将类型更改为 void
以便使用特化。
关于c++ - 为什么 decltype(declval<T>().func()) 在 decltype(&T::func) 不工作的地方工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45310397/
我试图了解 declval() 之间的区别和 declval() ?有没有示例 T&可以在 T 时使用不能吗? #include #include struct X { X() = delet
用std::declval不是更好吗?声明形式: template T declval(); // (1) 然后是当前的: template T && declval(); // (2) std::c
我想弄清楚如何在 is_assignable 的实现中解释 declval() = declval()。 declval 将类型转换为引用。鉴于此,我将表达式转换为以下四种可能性之一: _Dest&&
我正在尝试使用 detector我是根据std::experiment::is_detected_v写的检查类型是否可分配。然而std::declval() = std::declval()无效且只有
根据 is_destructible 的定义( http://eel.is/c++draft/meta.unary.prop#lib:is_destructible ), is_destructib
标准库实用程序 declval是defined作为: template add_rvalue_reference_t declval() noexcept; 在 C++11 中引入右值引用似乎是个好主
我想尝试编写一个模板包装器来检查类是否具有成员函数。为此,有必要使用 std::declval template struct has_member().push_back())>>:std::tru
以下代码在模板参数T时编译失败是基本类型,例如 int (在 gcc 4.8 上)。这是符合标准的行为吗?我对std::declval的理解是它总是解析为 T&&或 T& . template vo
引用以下Proposing Standard Library Support for the C++ Detection Idiom中的例子: // primary template handles
假设我有一个将要专门化的模板化函数,所以我真的不关心基本实现。我可以做这样的事情吗: template T dummy() { assert(false); return declv
一个最小的例子,展示了两种获取迭代器类型的方法,我天真地希望得到与结果相同的类型: template struct foo { using iterator = decltype(std::
有人可以解释一下 std::declval 是如何工作的吗?我在 gcc headers/type_traits(第 2248-2262 行)中找到了这个实现,它是(清理了一下以提高可读性): tem
我在玩 GCC (4.9.2) abi::__cxa_demangle 时遇到了无法分解特定符号名称的情况。 那个符号是: _ZNK12DebugWrapperIR5TestClsE5getIdIIE
当您使用模板和 decltype 时你经常需要某种类型的实例,即使你没有任何时间。在这种情况下,std::declval()非常有用。这将创建一个 T 类型的虚构实例. 有没有类似的概念?即一个函数,
查看libstdc++源码,发现如下declval实现: template _Up __declval(int); // (1) template _Tp __declval(long); // (
我正在编写一些元函数,并且我有想法使用 C++17 的 if constexpr 结合推导的返回类型来编写它们。这是一个例子: #include #include #include templa
cppreference web site引入 declval : Note that because no definition exists for declval, it can only be
std::declval是一个编译时实用程序,用于构造表达式以确定其类型。它是这样定义的: template typename std::add_rvalue_reference::type decl
据我所知,我无法声明对 void 的右值引用. 例如,以下代码格式错误: void f(void &&v) { } 来自 [20.2.6/1] (函数模板 declval)我们有一个 declval
std::declval是一个编译时实用程序,用于构造表达式以确定其类型。它是这样定义的: template typename std::add_rvalue_reference::type decl
我是一名优秀的程序员,十分优秀!