4

に暗黙的に変換できる C++ クラスを作成しようとしていますstd::array。変換は機能しますが、暗黙的ではありません。

#include <array>

class A {
private:
    std::array<float, 7> data;
public:
    operator std::array<float, 7>&() { return data; }
    operator const std::array<float, 7>&() const { return data; }
};

int main() {
    A a;
    a[1] = 0.5f; // fails to compile
    auto it = a.begin(); // fails to compile
    A b;
    static_cast<std::array<float, 7>>(b)[1] = 0.5f; //ok
    auto it2 = static_cast<std::array<float, 7>>(b).begin(); //ok
    return 0;
}

private上記の例は、基本的にクラスのメンバーを完全に公開するため、非常に複雑であることを理解しています。std::arrayしかし、これは単純化しすぎた例です。暗黙の変換が機能しない理由の問題に取り組もうとしているだけです。

上記の例を と の両方clang-3.2で試しましたgcc-4.8。どちらもコンパイルしません。

さらに困惑するのは、ポインターへの暗黙的な変換を使用すると、コンパイルが明らかに成功することです。

operator float *() { return data.begin(); }
operator const float *() const { return data.cbegin(); }

しかしもちろん、これは の多くの優れた点を失うことを意味しstd::array、より良い解決策がなければ受け入れます。

4

2 に答える 2

3

operator[]begin()onをオーバーロードするAか、またはからパブリックに継承することで、それらを機能させることができますarray(ただし、お勧めしません)。

暗黙的な変換は、あなたの場合ではなく、意味がある場合にのみ機能します(たとえば、Aを期待する関数に渡したstd::array<float, 7>場合など)。あなたが私に尋ねるなら、それは良いことです。

于 2013-08-27T08:15:29.507 に答える