1

クラス テンプレートではなく、特定の型への参照を (たとえば構築時に) 格納し、後で getter メソッドを介して取得できるクラスを定義することは可能ですか?

struct Wrapper {
  template<typename T> Wrapper(const T& t): t_(t);

  // How to store the reference??
};

Boost::variantクラステンプレートとして実装されているため、もちろん解決策ではありません。RTTIもありません。(HPC 環境で、パフォーマンスがすべてです!)

getter()型を記憶できる必要があります。そうすれautoば後で使える。

4

2 に答える 2

5

getter() は型を記憶できる必要があります。

できません。タイプを消去しました。これは、一貫した型のオブジェクト内に任意の型の値を入れるときに起こることです。これは「型消去」と呼ばれます。元の型は、含まれているクラスから削除されます。

この結果の 1 つは、タイプを魔法のように復元できないことです。インスタンスごとに型で初期化されたクラスを持つことはできず、その特定のインスタンスがどのように初期化されたかに基づいて、そのメンバー関数の 1 つが異なる型を返します。

C++ は静的に型付けされた言語です。すべての関数の戻り値の型は、コンパイル時に定義する必要があります。実行時にクラスに入れるもののために変更することはできません。

型を覚えられません。

RTTIが使えません。

次に、必要なのはvoid*. RTTI は、型安全な方法で元の値の型を復元する唯一の方法です。タイプセーフが必要ない場合は、void*. あなたがすることは、ラッパーを書くことだけですstatic_cast<T*>

void*andの周りにラッパーを書いても意味がありませんstatic_cast。それがあなたの望むものであり、それらを使用することの危険 (つまり、型システムを壊すこと) を喜んで受け入れるのであれば、それを使用してください。存在する理由は、タイプセーフboost::anyを提供することです。これにより、少なくとも間違ってキャストしていることがわかります。 void*

于 2012-08-04T22:42:34.323 に答える
3

boost::any http://www.boost.org/doc/libs/1_50_0/doc/html/any.html

std::vector<boost::any> many;
int i = 5;
std::string a = "5";

many.push_back(i);
many.push_back(a);

std::string res;
if (many[1].type() == typeid(std::string))
  res = boost::any_cast<std::string>(many[1]);
于 2012-08-04T19:28:05.977 に答える