for(i = 0;我< ARRAY_DEPTH(P); ++ i){ std :: printf(" p [%u] .m_id ==%d \ n",i,p [i] .object.m_id); std :: printf(" p [%u] .m_name ==%s \ n ---- \ n", i,p [i]。 object.m_name.c_str()); } putchar(''\ n''); for(i = 0; i< ARRAY_DEPTH(c); ++ i){ std :: printf(" c [%u] .m_id ==%d \ n",i,c [i] .object.m_id); std :: printf(" c [%u] .m_name ==%s \ n ---- \ n", i,c [i] .object.m_name.c_str()); } std :: puts(" -----------------------"); } std: :puts(" \\\\\\press< ENTER to exit ..."); std :: getchar(); 返回0; } __________________________________________________ _____________________ 此代码编译完全没有GCC,Comeau,VC ++ 8/9的警告 和EDG / C ++。 你们中的任何人都可以发现任何一个精炼的行为?此外,代码是否接近 标准C ++?请尝试忍受在这里。我不是C ++专家... :^( 感谢您的所有时间!我真的很感激。T object;struct guard {T& object;guard(T& _object) : object(_object) {(object.*T_fp_start)();}~guard() {(object.*T_fp_join)();}};active() {(object.*T_fp_start)();}template<typename T_p1>active(T_p1& p1) : object(p1) {(object.*T_fp_start)();}template<typename T_p1>active(T_p1 const& p1) : object(p1) {(object.*T_fp_start)();}template<typename T_p1, typename T_p2>active(T_p1& p1, T_p2& p2) : object(p1, p2) {(object.*T_fp_start)();}template<typename T_p1, typename T_p2>active(T_p1 const& p1, T_p2& p2) : object(p1, p2) {(object.*T_fp_start)();}template<typename T_p1, typename T_p2>active(T_p1& p1, T_p2 const& p2) : object(p1, p2) {(object.*T_fp_start)();}template<typename T_p1, typename T_p2>active(T_p1 const& p1, T_p2 const& p2) : object(p1, p2) {(object.*T_fp_start)();}template<typename T_p1, typename T_p2, typename T_p3>active(T_p1 const& p1, T_p2& p2, T_p3& p3): object(p1, p2, p3) {(object.*T_fp_start)();}// [and on and on for more and more parameters...]~active() {(object.*T_fp_join)();}};/* Sample usage__________________________________________________ ____________*/#include <cstdio>#include <cstddef>#include <string>struct Buffer {Buffer() {std::printf("(%p)->Buffer::Buffer()\n", (void*)this);}~Buffer() {std::printf("(%p)->Buffer::~Buffer()\n", (void*)this);}};struct Producer {int const m_id;std::string const m_name;Buffer& m_Buffer;Producer(int const id, Buffer& _Buffer): m_id(id), m_name("Default Producer"), m_Buffer(_Buffer) {std::printf("(%p)->Producer::Producer()\n", (void*)this);}Producer(int const id, char const* name, Buffer& _Buffer): m_id(id), m_name(name), m_Buffer(_Buffer) {std::printf("(%p)->Producer::Producer()\n", (void*)this);}~Producer() {std::printf("(%p)->Producer::~Producer()\n", (void*)this);}void start() {std::printf("(%p)-void Producer<''%s''>::start() - Buffer(%p)\n",(void*)this, m_name.c_str(), (void*)&m_Buffer);}void join() {std::printf("(%p)-void Producer::join() - Buffer(%p)\n",(void*)this, (void*)&m_Buffer);}};struct Consumer {int const m_id;std::string const m_name;Buffer& m_Buffer;Consumer(int const id, Buffer& _Buffer): m_id(id), m_name("Default Consumer"), m_Buffer(_Buffer) {std::printf("(%p)->Consumer::Consumer()\n", (void*)this);}Consumer(int const id, char const* name, Buffer& _Buffer): m_id(id), m_name(name), m_Buffer(_Buffer) {std::printf("(%p)->Consumer::Consumer()\n", (void*)this);}~Consumer() {std::printf("(%p)->Consumer::~Consumer()\n", (void*)this);}void start() {std::printf("(%p)-void Consumer<''%s''>::start() - Buffer(%p)\n",(void*)this, m_name.c_str(), (void*)&m_Buffer);}void join() {std::printf("(%p)-void Consumer::join() - Buffer(%p)\n",(void*)this, (void*)&m_Buffer);}};#define ARRAY_DEPTH(mp_this) ( \sizeof((mp_this)) / sizeof((mp_this)[0]) \)int main() {{Buffer b;active<Producerp[] = {active<Producer>(123, b),active<Producer>(456, "Custom Producer", b),active<Producer>(789, b),active<Producer>(234, "I am a Producer!", b),active<Producer>(567, b)};active<Consumerc[] = {active<Consumer>(891, "I am a Consumer!", b),active<Consumer>(345, b),active<Consumer>(678, b)};std::size_t i;std::puts("-----------------------");for (i = 0; i < ARRAY_DEPTH(p); ++i) {std::printf("p[%u].m_id == %d\n", i, p[i].object.m_id);std::printf("p[%u].m_name == %s\n----\n",i, p[i].object.m_name.c_str());}putchar(''\n'');for (i = 0; i < ARRAY_DEPTH(c); ++i) {std::printf("c[%u].m_id == %d\n", i, c[i].object.m_id);std::printf("c[%u].m_name == %s\n----\n",i, c[i].object.m_name.c_str());}std::puts("-----------------------");}std::puts("\n\npress <ENTERto exit...");std::getchar();return 0;}__________________________________________________ _____________________This code compiles perfectly fine with no warnings on GCC, Comeau, VC++ 8/9and EDG/C++.Can any of you spot any undefined behavior? Also, is the code anywhere nearstandard C++? Please try and bear with be here. I am NOT a C++ expert...:^(Thanks for all of your time! I really do appreciate it. 这篇关于这段代码有效吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持! 上岸,阿里云!
08-19 13:50
查看更多