#ifdef FEATURE_A
,#ifdef _MSC_VER
のようなプリプロセッサブロックが詰まっています。プリプロセッサの#ifdefブロックをテンプレートの実装に置き換えてください。
いくつかのプリプロセッサブロックをテンプレート実装で置き換えるために、コードの一部をリファクタリングしたいと思います。
EDIT: タスクは混乱を取り除くために、すべてのプリプロセッサブロックを削除し、そのうちのいくつかではありません。
私はので、ここで現実の世界(ない私のコード)からの一つだ、foobarの例で穴にあなたをしたくない:
template <typename T>
std::string demangle()
{
#ifdef __GNUC__
size_t sz;
int status;
char* ptr = abi::__cxa_demangle(typeid(T).name(), 0, &sz, &status);
std::string name(ptr ? ptr : "", ptr ? strlen(ptr) : 0);
if(ptr){ free(ptr); }
std::string::size_type pos = name.rfind("::");
if(pos != std::string::npos)
{
name = name.substr(pos + 2);
}
#elif _MSC_VER
std::string name(typeid(T).name());
static const std::string struct_prefix("struct ");
static const std::string class_prefix("class ");
static const std::string ptr_postfix(" *");
std::string::size_type
at = name.find(struct_prefix);
if(at != std::string::npos) { name.erase(at, struct_prefix.size()); }
at = name.find(class_prefix);
if(at != std::string::npos) { name.erase(at, class_prefix.size()); }
at = name.find(ptr_postfix);
if(at != std::string::npos) { name.erase(at, ptr_postfix.size()); }
#else
std::string name(typeid(T).name());
#endif
return name;
}
質問1:equvalentテンプレートの実装にこれを変換する方法を?
質問2:なぜ努力する価値があるのですか、それともなぜですか?
とにかくこれらのプリプロセッサ定義が必要です。たぶんあなたは3つの関数 'std :: string demangle()'を持っているかもしれません。 –
これはとにかく必要ですが、実装からクラッタを取り除くことができます。 – mrAtari
プリプロセッサディレクティブをテンプレートで置き換えることができます(他の人はそうすることはできないと言います)、そのような置き換えではテキストの総量が少なくなることはありません。だから、あなたはもっと大きくて不器用な何かを得るでしょう、それは読者のために驚くべき方法で働くでしょう。結局のところ、C++のコーダーは、PPディレクティブが何であるかを知っています。だから私はこれが勝利になるかどうか分からない。 –