首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏10km的专栏

    C++11 元编程(meta-programming)判断T是否有==操作符

    基本的原理与文中的差不多,利用SFINAE原则,通过返回类型后置来推断表达式的类型,推断的过程中利用declval,它可以获取类型的右值引用,以便来调用==操作符,这个过程是在编译期完成的。 如果通过==操作符比较declval的右值引用成功了,则会继续推断逗号表达式的类型,最终推断的函数返回类型为bool; 如果通过==操作符比较declval的右值引用失败了,则推断失败,编译器会选择优先级最低的 ()==declval()); //template<typename U> static auto test(int)-> decltype(declval().operator 有两种方式 declval()==declval()和declval().operator==(declval()) 第一种是真接按常用的==操作符用法写的==表达式,第二种则是把操作符 ()==declval<T>()); //template<typename U> static auto test(int)-> decltype(declval().operator

    52930编辑于 2022-05-07
  • 来自专栏Android点滴分享

    c++模版笔记(3)

    std::declval() 类型占位符,不需要创建对象, 用在不需要计算的上下文中,比如decltype或sizeof。 std::declval<T1>() : std::declval<T2>())>> RT max

    45310编辑于 2022-10-25
  • 来自专栏C++ 动态新闻推送

    C++ 中文周刊 第111期

    Types> using TupleSetT = decltype((std::declval<std::tuple<>>() + ... + std::declval<Types>())); 可能有命名空间冲突问题 Types> using TupleSetT = decltype((std::declval<std::tuple<>>() + ... + std::declval<Types>())); } using

    39550编辑于 2023-05-03
  • 来自专栏10km的专栏

    C++11:模板实现opencl向量类型的简单运算符重载及length,distance函数

    .); using type=decltype(vector_type<SIZE>(std::declval<T>())); }; /* * 根据opencl 向量类型返回向量的元素类型和向量长度 <T>().s[0] - declval<T>().s[0])>::type> inline typename std::enable_if<2<VI::size, RET>::type operator <T>().s[0] - declval<T>().s[0])>::type> inline typename std::enable_if<2<VI::size, RET>::type operator <T>().s[0] - declval<T>().s[0])>::type> inline typename std::enable_if<2==VI::size, RET>::type <T>().s[0] - declval<T>().s[0])>::type> inline typename std::enable_if<2<VI::size, RET>::type operator

    2K10发布于 2019-05-25
  • 请介绍下 C++ 模板中的 SFINAE?它的原则是什么?

    structhas_size_method:std::false_type{};template<typenameT>structhas_size_method<T,std::void_t<decltype(std::declval <T>())),decltype(std::end(std::declval<T>()))>>:std::true_type{};//使用示例template<typenameT>std::enable_if_t <T>())),decltype(std::end(std::declval<T>()))>>:std::true_type{};//通用版本template<typenameT>std::enable_if_t structis_smart_ptr:std::false_type{};template<typenameT>structis_smart_ptr<T,std::void_t<decltype(std::declval <T>().operator->()),decltype(std::declval<T>().get())>>:std::true_type{};template<typenameT>voidprint_pointer_info

    15310编辑于 2026-02-24
  • 来自专栏光城(guangcity)

    现代C++之SFINAE

    2.老式的C++98方式2.1重载决议2.2 SFINAE2.3 sizeof运算符2.4 结合一切2.5 实现我们的想法2.6 小结3.C++11方式3.1 decltype, declval, auto 3.1 decltype, declval, auto & co decltype 还记得sizeof操作符对传递给它的表达式进行“伪计算”,然后返回表达式类型的大小吗? declval对于我们的SFINAE结构确实非常方便。 template<typename C> static constexpr decltype(std::declval<C>().serialize(), bool()) test(int /* to 'recreate' an object of 'UnnamedType'. // We use std::declval to also 'recreate' an object of

    3.6K20发布于 2020-02-13
  • 来自专栏高性能服务器开发

    C++17一个很冷门很有意思的新特性

    has_a_member : std::false_type {}; template <class T>struct has_a_member<T, std::void_t<decltype(std::declval constexpr bool is_iterable{}; template <typename T>constexpr bool is_iterable<T, std::void_t<decltype(std::declval <T>().begin()), decltype(std::declval<T>().end())>> = true; 比如判断某个类是否有某个函数: template <class T, class has_hello_func : std::false_type {}; template <class T>struct has_hello_func<T, std::void_t<decltype(std::declval

    95610编辑于 2022-07-01
  • 来自专栏10km的专栏

    C++11:如何判断一个类是另一个模板类的子类?

    .); }; #define is_kind_of(TM, ...) decltype(is_kind_of_::check<TM>(std::declval<__VA_ARGS__>())) 经过测试 CL_TYPE check(memory_cl<CL_TYPE>); static void check(...); using cl_type=decltype(check(std::declval

    3.3K10发布于 2019-05-25
  • 来自专栏10km的专栏

    C++11 元编程 判断是否有std::hash特例并提供hash函数通用实现

    /* SFINAE 判断T有没有std::hash<T>特例实现 */ template<typename U> static std::hash test(decltype(declval <std::hash>().operator()(declval()))); template<typename U> static default_hash test(...); <typename T> struct has_hash_specific{ template<typename U> static auto test(int)-> decltype(declval <std::hash>().operator()(declval())); template<typename U> static void test(...); enum{

    4.7K10发布于 2019-05-25
  • 来自专栏光城(guangcity)

    C++那些事之SFINAE

    2.老式的C++98方式2.1重载决议2.2 SFINAE2.3 sizeof运算符2.4 结合一切2.5 实现我们的想法2.6 小结3.C++11方式3.1 decltype, declval, auto 3.1 decltype, declval, auto & co decltype 还记得sizeof操作符对传递给它的表达式进行“伪计算”,然后返回表达式类型的大小吗? declval对于我们的SFINAE结构确实非常方便。 template<typename C> static constexpr decltype(std::declval<C>().serialize(), bool()) test(int /* to 'recreate' an object of 'UnnamedType'. // We use std::declval to also 'recreate' an object of

    2.9K20编辑于 2022-06-20
  • 来自专栏光城(guangcity)

    现代C++之SFINAE应用(小工具编写)

    struct has_output_function { template<class U> static auto output(U *ptr) -> decltype(std::declval bool value = decltype(output<T>(nullptr))::value; }; 这里再提一下,当容器不能直接输出的时候,也就是第一个函数在std::declval ostream& os, const T& element, const Cont&, const std::true_type) -> decltype(std::declval

    1.5K20发布于 2020-02-13
  • 来自专栏10km的专栏

    C++11模板:如何判断类中是否有指定名称的成员变量?

    .); using type=decltype(check(std::declval<T>())); enum{value=! std::decay<decltype(_T::s)>::type;\ static void check(...);\ using type=decltype(check(std::declval

    5.5K10发布于 2019-05-25
  • 来自专栏简易现代魔法

    实际工程中的 C++ 模板

    <CfgItem>().version_ranges())->lo()), decltype(std::begin(std::declval<CfgItem>().version_ranges( 这里使用 void_t 将多个类型声明忽略掉以适应 template<class CfgItem, class = void> 中的第二个类型参数: decltype(std::begin(std::declval <CfgItem>().version_ranges())->lo()), decltype(std::begin(std::declval<CfgItem>().version_ranges())-> hi()) 虽然说这两个类型声明被忽略了,但是它们还是会参与替换,decltype 可以根据括号里的表达式计算出其类型,而 std::declval<T>() 则相反,给定一个类型,它可以获得该类型的值 如果一个类型没有带 version_ranges 字段,则 std::declval<CfgItem>().version_ranges() 会失败,如果这个 version_range() 返回的对象不支持

    2.6K20发布于 2021-08-10
  • 深入理解 C++17 std::is_swappable

    false_type {};template <typename T>struct is_swappable_helper<T, std::void_t<decltype(std::swap(std::declval <T&>(), std::declval<T&>()))>> : std::true_type {};// 定义 is_swappabletemplate <typename T>struct is_swappable

    28100编辑于 2025-02-08
  • 来自专栏【腾讯云开发者】

    C++特殊定制:揭秘cpo与tag_invoke!

    constexpr (_Has_member<_Ty>) { return {_St::_Member, noexcept(_Fake_decay_copy(_STD declval (_Has_ADL<_Ty>) { return {_St::_Non_member, noexcept(_Fake_decay_copy(begin(_STD declval _Begin::_Cpo begin; } template <class _Ty> using iterator_t = decltype(_RANGES begin(_STD declval Args> using tag_invoke_result_t = decltype(tag_invoke(std::declval<CPO&&>(), std::declval<Args&&>(). Args> concept nothrow_tag_invocable = noexcept(tag_invoke(std::declval<CPO&&>(), std::declval<Args&&

    1.5K10编辑于 2022-06-24
  • 来自专栏sofu456

    c++模板使用

    remove_reference::type 变量 std::enable_if<condition>::type 条件满足返回类型,不满足无类型编译错 decltype 编译期获取变量类型 std::declval

    1K20编辑于 2022-05-10
  • 来自专栏后台公论

    C++设计模式之SFINAE:用来检测类中是否有某个成员函数

    has_push_back:std::false_type {}; template <typename T> struct has_push_back<T, void_t<decltype(std::declval <T>().push_back(std::declval<typename T::value_type>()))>>:std::true_type {}; int main() { std::

    5.8K20编辑于 2021-12-20
  • 来自专栏C++ 动态新闻推送

    C++ 动态新闻推送 第50期

    Types 讨论了一下把返回值放到后面的可行性,主要原因是作者开发的库经常会遇到这个返回值类型不确定的场景,比如 template<typename A, typename B> decltype(std::declval () * std::declval()) multiply(A a, B b) { return a*b; } The 114 standard C++ algorithms.

    53210编辑于 2022-02-23
  • 来自专栏C++

    深入探究 C++17 std::is_invocable

    ., std::void_t<decltype(std::declval<F>()(std::declval<Args>()...))>> : std::true_type {};// 定义 is_invocabletemplate

    63500编辑于 2025-02-08
  • 来自专栏C++ 动态新闻推送

    C++ 中文周刊 第83期

    推迟到emplace 那一刻 template<typename F> struct deferred_call { using result_type=decltype(std::declval< string char*转换问题,加个补丁 template<typename F> struct deferred_call { using result_type=decltype(std::declval

    66220编辑于 2022-10-27
领券