2016-01-06 18 views
10

std::vector<double>インスタンスを含むカスタムコンテナクラスを作成しました。うまく動作します。他のAPIとの互換性のため、コンテナのコンテンツをstd::vector<double>コピーとしてエクスポートしたいと思います。現在、この作品:C++ - std :: vectorの新しいコンストラクタを作成する<double>?

MyContainer container; 
.... 
std::vector<double> vc(container.begin(), container.end()); 

しかし、可能性は書くことができるようにしたい場合:

MyContainer container; 
.... 
std::vector<double> vc(container); 

私は(簡単に)などstd::vector<double>コンストラクタを作成できますか?

+0

ありがとうございます。今日私はキャストオペレーターについて学びました。しかし、私は一般的に暗黙のうちに明示的に好むので、@Mamame Elyseの答えを受け入れるようにしました。 – user422005

+0

答えにもかかわらず、「キャスト演算子」はありません。彼らは仕事が単にあるタイプから別のタイプへの変換を提供するだけの "**変換**演算子"について話しています。 **キャスト**は、コンパイラに変換を指示するためにコードに記述したものです。これは**明示的な**変換です。コンパイラは、キャストを見ることなくいくつかの変換を行うこともできます。それは**暗黙の**変換です。変換演算子を「明示的」とマークすると、コンパイラが使用できる状況が制限され、しばしばキャストが必要になります。 –

答えて

17

あなたはstd::vector<double>に明示的な変換を作成することができます。

その後
explicit operator std::vector<double>() const { 
    return std::vector<double>(begin(), end()); 
} 

std::vector<double> vc(container);std::vector<double>移動コンストラクタを呼び出します。

計算的に高価なコンバージョンは、一般的には面倒です。したがって、ベクトルファクトリ関数は、賢明なアプローチことがあります

class MyContainer { 
public: 
    using value_type = double; 
    // ... 
}; 

template<typename Source> 
auto to_vector(Source source) { 
    return std::vector<typename Source::value_type>(source.begin(), source.end()); 
} 

次にあなたが書いたと思います:

MyContainer container; 
// ... 
auto vc = to_vector(container); 

それは互換性value_typebeginendを持っているもので動作するように、これはまた、より一般的ですメンバー。

2

このようなstd :: vectorコンストラクタを(簡単に)作成できますか?

これは、std::vectorのクラス宣言を変更する必要があるため、できません。

MyContainerstd::vector<double>にキャスト演算子を指定できます。

1

自分で作成していないクラスのAPIを変更することはできません。しかし、私はあなたのケースでキャストオペレータがうまくいくと思います。たとえば(これには-std=c++11が必要です):

#include <iostream> 
#include <vector> 

struct Foo 
{ 
    operator std::vector<double>() const 
    { 
    return std::vector<double> { 1, 2, 3 }; 
    } 
}; 

int main() 
{ 
    Foo foo; 
    std::vector<double> bar = foo; // Applies the cast operator defined in Foo 
    std::cout << bar.size() << std::endl; // Prints "3" 
    return 0; 
} 
+0

悪いと間違って!少なくとも明示的にしてください.... –

+1

なぜそれが悪いのか、なぜ間違っているのか説明してください。 – mindriot

+0

他の答えとコメントでうまくカバーしています。このような重度の暗黙の変換によってバグが発生します。 –

関連する問題