6

同様の質問に対するSOの回答を見たコードから「装飾された名前の長さを超えました」という警告が表示されます。*注: これをオフにする方法 (プラグマ) を知っています。また、これは「無視」できる警告であり、UNIX ベースのコンパイラはそれを出力しない可能性があることも知っています :P *

この質問には実用的な要素があります。エラーが発生した場合は、かなり恐ろしいテキストとテンプレートを調べなければなりません。現在、これらのエラーのほとんどはタイプミスによるものですが、微妙な問題があった場合、問題が何であるかを実際に見つけるのは悪夢です.

私のコードはコンパイルして動作しますが、上で述べたように警告が表示されます。私は「比較的」小さな表情をしています

...
auto expression = (l,aComma,w,aComma,x,aComma,y,aComma,z);
std::cout << expression;

式テンプレート用に定義したコンマ演算子から生成します (必要に応じて投稿できますが、これを最小限に抑えようとしています - かなり標準的なものがコピーされています):

//
//Expression 
//
template < class E >
struct Expr 
{
    E expr_;
    Expr (E e) : expr_ (e) {}
    std::ostream& print(std::ostream& out) { return expr_.print(out); }
};

template < class L, class H, class OP >
struct BinExpr 
{
    L l_;
    H h_;
    BinExpr (L l, H h) : l_ (l), h_ (h) {}
    std::ostream& print(std::ostream& out) { l_.print(out) ; return h_.print(out); }
};

template< class A, class B >
Expr< BinExpr< Expr<A>, Expr<B>, Print<Expr<A>,Expr<B> > > > 
operator , ( Expr<A> a, Expr<B> b )
{
    typedef BinExpr < Expr<A>, Expr<B>, Print<Expr<A>,Expr<B> > > ExprT;
    return Expr<ExprT>(ExprT(a,b));
}

Microsoft のページでは、この警告を回避するためのリファクタリングについて説明しています。structMSは、テンプレート化されたelementメンバーを含むプレーンで各レベルをラップします。これに関する問題は、式テンプレートを作成する上での要点は、必要なオブジェクトのツリーを作成するために暗黙的な構築を使用することであり、事前に作成するものを正確に定義する必要がないことです。そう...

  • 私が聞きたい質問は、機能と柔軟性を失うことなく、どうにかして長さを型定義できるかどうかです。

  • または、マイクロソフトの提案を使用して、機能と柔軟性を失うことなく、構造の一部をラップすることはできますか? Exprコンマの間に「リスト」する前にオブジェクトを設定するので、オブジェクトで使用するタイプに対してそれを行うことができます。しかし、アイテムを追加すると長さが長くなるため、おそらく再びこの制限に達するでしょう. また、新しい機能を追加すると、さらに複雑になります。これらは同様に作成されるため、おそらくより多くの頭痛の種が発生します...

  • 役立つ C++11 の機能はありますか? 末尾の戻り値の型を試しましたが、内部の typedef は有効ではありませんでした (それが役に立ったかどうかはわかりません)。


4

1 に答える 1

4

この警告に遭遇し、警告が出力されないようにコードのリファクタリングを調べたときはいつでも、リファクタリングが不可能であることがわかりました。これらのすべてのテンプレート パラメーターが必要ない場合は、最初から存在していなかったでしょう。

MSページにも次のように書かれています:

ただし、プログラムの正確性は、切り捨てられた名前の影響を受けません。

この事実に基づいて、私の SOP は次のよう#pragmaに警告を発します。

#pragma warning( disable: 4503 )

この解決策は原子爆弾に少し似ていることは認めます。ただし、これは、どのレベルでもコンパイラの警告を実際に無視する唯一の例であり、安全に無視できると信じています。

于 2012-11-09T16:02:18.397 に答える