我想实现像 rust 的 dyn 特性这样的东西(我知道这不适用于多重继承)
\n\nRun Code Online (Sandbox Code Playgroud)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 …
#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}\nRun Code Online (Sandbox Code Playgroud)\n以下输出是c++17标准的结果
\n| 海湾合作委员会 | 铛 | 微软 |
|---|---|---|
| 001 | 001 | 010 |
| 110 | 101 | 101 |
或者所有的编译器都是错误的\xef\xbc\x9f
\n根据这个规则,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)