100行程度でC++ならではのいくつかの文法が用いられているものってありますか?
http://www.hatena.ne.jp/1141028372
より
ほい!っと・・・
これはどうか!?
(追記:やっぱダメだわ・・・知らない人に教える事ほどムズカシイ事はない おrz!!!)
/**
無名namespace
namespace
using
抽象クラス
テンプレート
new deleteあとは
throw try catch
functor
各種デザインパターン、STL等
*/#include <iostream>
#include <string>
namespace{
const char*hello = "Hello, world!";
void line(){
std::cout << "---------------" << std::endl;
}
}namespace cpp{
struct IAbstruct{
virtual ~IAbstruct(){}
virtual void output() = 0;
///std::stringはコンストラクタで例外を返さないこととする。
virtual std::string name()const = 0;
};
class IOutput : public IAbstruct
{
std::string mString;
public:
IOutput(const std::string &x) : mString(x){}
virtual ~IOutput(){}
virtual void output(){
std::cout << mString << std::endl;
}
};
class COutputHello : public IOutput{
public:
COutputHello() : IOutput(hello){
}
virtual ~COutputHello(){}
virtual std::string name()const{
return std::string("COutputHello");
}
};
template<std::size_t COUNT_>
class COutputHelloCount : public COutputHello{
public:
COutputHelloCount(){}
virtual ~COutputHelloCount(){
}
virtual void output(){
std::size_t i;
for(i=0;i<COUNT_;i++){
COutputHello::output();
}
}
virtual std::string name()const{
return std::string("COutputHelloCount");
}
};
}//end of namespacenamespace cplusplus{
template<class POLICY_>
struct COutputHello{
POLICY_ mPolicy;
void output(){
mPolicy.output();
}
void output_name(){
std::cout << "template adapter" << std::endl;
std::cout << mPolicy.name() << std::endl;
}
};
}
int main(){
//compile error! 実装していないvirtual関数がある。
//IAbstruct *p = new IOutput("hello! world");//compile error! COutputHelloの二重定義?
//using namespace cpp;
//using namespace cplusplus;
{
using namespace std;
cpp::IAbstruct *pi = new cpp::COutputHello();
pi->output();
cout << pi->name() << endl;
delete pi;
}
line();
{
std::cout << "3 count" << std::endl;
using namespace cpp;
IAbstruct *pi = new COutputHelloCount<3>;
pi->output();
delete pi;
}line();
cplusplus::COutputHello<cpp::COutputHello> a;
a.output();
a.output_name();
line();
std::cout << "10 count" << std::endl;
typedef cplusplus::COutputHello<
cpp::COutputHelloCount<10>
> COutputHello;
using std::cout;
using std::endl;
COutputHello w;
w.output();
a.output_name();
line();
cout << std::flush;
#ifdef _DEBUG
system("PAUSE");
#endif
return 0;
}