" ..." DECLARATION, , :
- define
ABC - ( ),
ABC - ,
"ABC"
tl; dr: # 1 , . # 2 , CRTP, # 3 .
:
, , "". ++. (. " " )
- , .
, CRTP: , , :
template <class T>
class Base {
public:
void doSomething(T const&);
};
class ABC : public Base<ABC> {
};
, , .
++ , , ( , , ...) , . ( , ). typeid(T).name(), , , - , .
, ( ) "ABC" ABC, "ABC" . , - # 2, ABC ABC .
:. , , , . , , /:
class ABC {
DECLARATION(ACB);
};
, , - ( , ACB ). , , , :
class x
std::string GetClassName() { \
return std::string(
} \
}; \
class x : public x
:
CLASS_DEF(ABC)
{
private:
void ABCFun1();
void ABCFun2();
}
, .
, # 3 , ?
, , , . . , , boost::mpl::string<'Hell','o Wo','rld!'>, . , ++ 11 , ( boost::mpl::string), , , . -, # 2 # 3, ( , )
class ABCDE: public Base<ABCDE, 'ABCD', 'E'> { /* ... */ }
, . , CRTP, :
template <class T>
class Base {
public:
std::string GetClassName() const {
return T::name;
};
};
class ABC : public Base<ABC> {
public:
constexpr static char const * name = "ABC";
};
++ 03 static const, (.. ABC.cpp)
, ABC, :
template <class T>
class Base {
public:
std::string GetClassName() const {
return static_cast<T const*>(this)->name;
};
};
class ABC : public Base<ABC> {
public:
const std::string name = "ABC";
};
++ 11. ++ 03 .
, , imo, , , , CRTP do # 2:
class Base {
public:
Base(std::string nm) : name(nm) {}
std::string GetClassName() const {
return name;
};
std::string name;
};
class ABC : public Base {
public:
ABC() : Base("ABC") {}
ABC(int i) : ABC() { }
};
Base , ++ 11, Base("ABC") ABC() .