0
異なるプリミティブタイプ(例えば、int
,float
,double
など)を格納できる異種コンテナのフォームがありますか?POD用のC++異種コンテナ?
最終的に、私はオペランドa
とb
は、要素が容器から引き出されており、同じまたは異なるタイプのものであってもよい、例えばauto res = a + b
、のために、明示的にタイプを参照することなく計算の要素を使用できるようにしたいです。
異なるプリミティブタイプ(例えば、int
,float
,double
など)を格納できる異種コンテナのフォームがありますか?POD用のC++異種コンテナ?
最終的に、私はオペランドa
とb
は、要素が容器から引き出されており、同じまたは異なるタイプのものであってもよい、例えばauto res = a + b
、のために、明示的にタイプを参照することなく計算の要素を使用できるようにしたいです。
C++では、std::anyを任意のコンテナに使用できます。古いC++バージョンでは、boost::anyを使用できます。
#include <iostream>
#include <vector>
#include <any>
struct A
{
int a;
explicit operator int() const { return a; }
};
struct B
{
double b;
explicit operator double() const { return b; }
};
int main()
{
A a{ 5 };
B b{ 6.};
std::vector<std::any> v;
v.push_back(3);
v.push_back(4.);
v.push_back(a);
v.push_back(b);
for (auto const e : v)
{
if (e.type() == typeid(double))
std::cout << std::any_cast<double>(e) << std::endl;
if (e.type() == typeid(B))
std::cout << (double)std::any_cast<B>(e) << std::endl;
}
}
すばらしい例、ありがとう@Lior Kogan! – valiano
弱い型指定のプログラミング言語を探しています。なぜあなたはC++でこれを行う必要がありますか?さて、BoostのVariantかAnyを考えてみてください。 –
C++は静的型付けされた言語です。つまり、各オブジェクトの型は実行時ではなくコンパイル時に指定されます。基本的にC++はあなたが記述しているようには機能しません。 –
@CodyGray:むしろ* "動的に型指定された" *、それでも* "強く型付けされた" *かもしれません。ちょうど* "静的に型付けされた" *。 – IInspectable