7

type の非型テンプレート パラメータを受け取るテンプレートがありますunsigned long long。このテンプレートをインスタンス化すると、非常に多くの数字が含まれるため、すぐに混乱します。実際、理想的には、バイナリ表現を使用してさらに悪化させます。最大 64 個01文字があります。視覚的に認識できる議論を作成するにはどうすればよいですか。例えば:

template <unsigned long long>
struct use_mask {
    // for this question it doesn't matter what the template actually does
};

int main() {
    use_mask<0b1001001010010010>    unreadable;    // OK, there are no binary literals
    use_mask<0b1001,0010,1001,0010> more_readable; // ... nor are there digit separators
}

おそらく値の前後にいくつかのものを使用して、後者の表記法を近似する方法はありますか?

4

5 に答える 5

1

各2進数の間にコンマが必要なため、完全ではありませんが、任意の量の空白と任意の2進数の任意のconst exprを許可します-たとえば、0xFFFF FFFF FFFF FFFFは次のようになります。

use_mask<bit64<
 1,1,1,1,  1,1,1,1,  1,1,1,1,  1,1,1,1,
 1,1,1,1,  1,1,1,1,  1,1,1,1,  1,1,1,1,
 1,1,1,1,  1,1,1,1,  1,1,1,1,  1,1,1,1,
 1,1,1,1,  1,1,1,1,  1,1,1,1,  1,1,1,1
>::VAL>

コード:

template <
    bool b3F,bool b3E,bool b3D,bool b3C,bool b3B,bool b3A,bool b39,bool b38,
    bool b37,bool b36,bool b35,bool b34,bool b33,bool b32,bool b31,bool b30,
    bool b2F,bool b2E,bool b2D,bool b2C,bool b2B,bool b2A,bool b29,bool b28,
    bool b27,bool b26,bool b25,bool b24,bool b23,bool b22,bool b21,bool b20,
    bool b1F,bool b1E,bool b1D,bool b1C,bool b1B,bool b1A,bool b19,bool b18,
    bool b17,bool b16,bool b15,bool b14,bool b13,bool b12,bool b11,bool b10,
    bool b0F,bool b0E,bool b0D,bool b0C,bool b0B,bool b0A,bool b09,bool b08,
    bool b07,bool b06,bool b05,bool b04,bool b03,bool b02,bool b01,bool b00
>
class bit64
{
public:
    static const unsigned long long VAL=0UL
        |((unsigned long long)b00<< 0)|((unsigned long long)b01<< 1)|((unsigned long long)b02<< 2)|((unsigned long long)b03<< 3)
        |((unsigned long long)b04<< 4)|((unsigned long long)b05<< 5)|((unsigned long long)b06<< 6)|((unsigned long long)b07<< 7)
        |((unsigned long long)b08<< 8)|((unsigned long long)b09<< 9)|((unsigned long long)b0A<<10)|((unsigned long long)b0B<<11)
        |((unsigned long long)b0C<<12)|((unsigned long long)b0D<<13)|((unsigned long long)b0E<<14)|((unsigned long long)b0F<<15)
        |((unsigned long long)b10<<16)|((unsigned long long)b11<<17)|((unsigned long long)b12<<18)|((unsigned long long)b13<<19)
        |((unsigned long long)b14<<20)|((unsigned long long)b15<<21)|((unsigned long long)b16<<22)|((unsigned long long)b17<<23)
        |((unsigned long long)b18<<24)|((unsigned long long)b19<<25)|((unsigned long long)b1A<<26)|((unsigned long long)b1B<<27)
        |((unsigned long long)b1C<<28)|((unsigned long long)b1D<<29)|((unsigned long long)b1E<<30)|((unsigned long long)b2F<<31)
        |((unsigned long long)b20<<32)|((unsigned long long)b21<<33)|((unsigned long long)b22<<34)|((unsigned long long)b23<<35)
        |((unsigned long long)b24<<36)|((unsigned long long)b25<<37)|((unsigned long long)b26<<38)|((unsigned long long)b27<<39)
        |((unsigned long long)b28<<40)|((unsigned long long)b29<<41)|((unsigned long long)b2A<<42)|((unsigned long long)b2B<<43)
        |((unsigned long long)b2C<<44)|((unsigned long long)b2D<<45)|((unsigned long long)b2E<<46)|((unsigned long long)b3F<<47)
        |((unsigned long long)b30<<48)|((unsigned long long)b31<<49)|((unsigned long long)b32<<50)|((unsigned long long)b33<<51)
        |((unsigned long long)b34<<52)|((unsigned long long)b35<<53)|((unsigned long long)b36<<54)|((unsigned long long)b37<<55)
        |((unsigned long long)b38<<56)|((unsigned long long)b39<<57)|((unsigned long long)b3A<<58)|((unsigned long long)b3B<<59)
        |((unsigned long long)b3C<<60)|((unsigned long long)b3D<<61)|((unsigned long long)b3E<<62)|((unsigned long long)b3F<<63)
        ;
};

これは、それをサポートするコンパイラの constexpr になることもあります

于 2013-11-07T03:02:31.490 に答える
0

実験用の C++ コンパイラはここにはありませんが、(UDL のテンプレート化された形式を使用して) 次の行に沿ったアプローチを試すことができます。

template<char... chars>
constexpr unsigned long long operator"" _bin();

template<char... chars>
constexpr unsigned long long operator"" _bin<'0', chars...>() {
  // return correctly shifted calculated value.
}

template<char... chars>
constexpr unsigned long long operator"" _bin<'1', chars...>() {
  // return correctly shifted calculated value.
}

template<char... chars>
constexpr unsigned long long operator"" _bin<'_', chars...>() {
  // simply forward to rest
}

具体的でなくて申し訳ありません。ここにはツールがありませんが、UDL 解析がこの方法で行われるのを見てきました。

于 2013-09-24T06:34:43.707 に答える