小编余国良*_*余国良的帖子

new (ptr) T() == static_cast<T*>(ptr)?

我想实现像 rust 的 dyn 特性这样的东西(我知道这不适用于多重继承)

\n
\n
template<template<typename> typename Trait>\nclass Dyn\n{\n    struct _SizeCaler:Trait<void>{ void* _p;};\n    char _buffer[sizeof(_SizeCaler)];\npublic:\n    template<typename T>\n    Dyn(T* value){\n        static_assert(std::is_base_of_v<Trait<void>,Trait<T>>\n            ,"error Trait T,is not derive from trait<void>"\n        );\n\n        static_assert(sizeof(_buffer) >= sizeof(Trait<T>)\n            ,"different vtable imple cause insufficient cache"\n        );\n\n        new (_buffer)Trait<T>{value}; \n    }\n    Trait<void>* operator->(){\n        return static_cast<Trait<void>*>(reinterpret_cast<void*>(_buffer));\n    }\n};\n\ntemplate<template<typename> typename Trait,typename T>\nstruct DynBase:Trait<void>\n{\nprotected:\n    T* self;\npublic:\n    DynBase(T* value):self(value){}\n};\n\nstruct Point{\n    double x,y;\n};\n\nstruct Rect{\n    Point m_leftDown,m_rightUp;\n    Rect(Point p1,Point p2){\n        m_leftDown = Point{std::min(p1.x,p2.x),std::min(p1.y,p2.y)}; \n        m_rightUp = Point{std::max(p1.x,p2.x),std::max(p1.y,p2.y)}; \n    }\n};\n\ntemplate<typename = void>\nstruct Shape;\n\ntemplate<>\nstruct Shape<void>\n{\n    virtual …
Run Code Online (Sandbox Code Playgroud)

c++ standards

6
推荐指数
1
解决办法
251
查看次数

关于捕获实体的 decltype(),哪个编译器符合 ISO 标准?

#include <iostream>\n#include <type_traits>\n\nint main(){\n\n    int i = 1;\n    int& j = i;\n\n    auto f2 = [j = j]() {\n        std::cout\n            << std::is_same_v<decltype(j), int&>\n            << std::is_same_v<decltype((j)), int&>\n            << std::is_same_v<decltype((j)), const int&>;\n    };\n    \n    auto f3 = [=]() {\n        std::cout\n            << std::is_same_v<decltype(j), int&>\n            << std::is_same_v<decltype((j)), int&>\n            << std::is_same_v<decltype((j)), const int&>;\n    };\n\n    f2();\n    f3();\n}\n
Run Code Online (Sandbox Code Playgroud)\n

以下输出是c++17标准的结果

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
海湾合作委员会微软
001001010
110101101
\n
\n

或者所有的编译器都是错误的\xef\xbc\x9f

\n

c++ lambda decltype language-lawyer c++17

3
推荐指数
1
解决办法
114
查看次数

为什么c++有这个规则:显式实例化定义忽略成员访问说明符:参数类型和返回类型可能是私有的

根据这个规则,C++可以在安全语法下直接破坏封装

时间:2018-12-07 标签:c++11

#include <iostream>

class A {
 public:
  A() = default;
 private:
  int data_ = 0;
};

template < int A::*Member >
class Access {
 public:
   friend  int GetPrivateData(A& obj) {
     return obj.*Member;
  }
};

template  class Access<&A::data_>; // explicit instantiation

int GetPrivateData(A& );


int main() {
  A obj;
  GetPrivateData(obj);

  return 0;
}

//https://www.zhihu.com/question/521898260/answer/2876618819
Run Code Online (Sandbox Code Playgroud)

时间:2017-12-17 标签:c++17

class A {
 public:
  A(int num) : data_(num) {};
 private:
  int data_ = 0;
};

template <typename PtrType>
class Access {
 public:
 inline …
Run Code Online (Sandbox Code Playgroud)

c++ c++11 c++17

1
推荐指数
1
解决办法
151
查看次数

标签 统计

c++ ×3

c++17 ×2

c++11 ×1

decltype ×1

lambda ×1

language-lawyer ×1

standards ×1