3

関数が const 以外の参照を引数として受け取る場合、呼び出し側ではどの入力が変更される可能性があるかが明らかでないため、読みにくいコードが作成される可能性があります。これにより、代わりにポインターを使用することを強制するいくつかのコード規則が導かれました。たとえば、

void func(int input, int* output);

int input = 1, output = 0;
func(input, &output);

それ以外の

void func(int input, int& output);

int input = 1, output = 0;
func(input, output);

個人的には、null をチェックする必要があるため、ポインターの使用は嫌いです。これにより、次のように、boost::ref (または C++11 の場合は std::ref) を使用して意図を通知できるかどうか疑問に思いました。

void func(int input, int& output);

int input = 1, output = 0;
func(input, boost::ref(output));

これは、会社のコーディング規約として使用されます。私の質問は、これが良い考えではない理由はありますか?

4

2 に答える 2

3

それは悪い考えではありませんが、実際には強制されていません (PiotrNycz が指摘しているように)。事実上、単なるコメントです。

ただし、次のように改善できます。

template <typename T>
class output_argument
{
public:
    template <typename U>
    friend output_argument<U> out(U& ref);

    T& get() const
    {
        return mRef;
    }

    operator T&() const
    {
        return get();
    }

private:
    explicit output_argument(T& ref) :
    mRef(ref)
    {}

    output_argument& operator=(const output_argument&); // not defined

    T& mRef;
};

template <typename U>
output_argument<U> out(U& ref)
{
    return output_argument<U>(ref);
}

与える:

void foo(int x, output_argument<float> f)
{
    int i = static_cast<int>(f);

    f.get() = static_cast<float>(i + x);
}

int main()
{
    float f = 5.0f;

    //fails: foo(1, f);
    foo(1, out(f));
}

しかし、関数名は引数に何が起こっているかを伝える必要があるため、通常、これらの種類のユーティリティは必要ありません: 引数をswap(x, y)非常に明確に変更します! また、値を返すには戻り値の型を使用する必要があり、このユーティリティを使用できるケースがさらに制限されます。

于 2012-11-01T22:59:23.693 に答える
1

この会社のコーディング規則は、次のように簡単に破ることができます (もちろん、誤って)。

void func(int input, int& output);

int input = 1, output = 0;
func(boost::ref(input), output);

これはコンパイルして問題なく動作しますが、読者に誤解を与える可能性があります。

一部の引数が変更されていることを示唆して、 func を適切な名前にすることをお勧めします。

void copyTo(int input, int& output);

最新の IDE では、関数が何をしているかを読みながら見ることができます。


たぶん、boost::cref を使用することで、会社のコーディング規約が逆になります。

void func(int input, int& output);

int input = 1, output = 0;
func(boost::cref(input), output);

ここでは、boost::ref のような間違いはあり得ません...

于 2012-11-01T22:47:41.043 に答える