私はちょうどバイナリリテラルoperator ""_b
をハックしようとしていましたが、再帰を終了しようとしました。パラメータパックのオーバーロードと競合しない空の明示的なテンプレートパラメータリストを使用して呼び出すことができる関数を定義するにはどうすればよいですか?次に、インスピレーション:何か変なパック拡張に一致します。空のバリューパック展開は、型パックまたはオプションの型パラメータと一致しますか?
しかしGCCは、空の引数リストの存在しない型が、明示的に必要とされない型のパラメータリストの型と一致しないと訴える。この方法で動作するはずですか?
template< char head, char ... tail >
constexpr unsigned long long parse_binary() {
return ((head - '0') << sizeof ... (tail))
+ parse_binary< tail ... >(); // Error: no overload for termination.
}
template< typename = void > // I want this to match an empty pack of chars.
// template< short = 0 > // even this would do.
constexpr unsigned long long parse_binary() {
return 0;
}
template< char ... digits >
constexpr unsigned long long operator ""_b() {
return parse_binary< digits ... >();
}
#include <iostream>
int main() {
std::cout << 010101_b << '\n';
}
注:質問はoperator ""_b
を実装していません。この問題は、パックをパラメータリストに展開し、std::integral_constant
型を渡すことで解決できます。
注2:このコードは実際にはマイナー調整で機能します。下の私の答えを参照してください。しかし、それは直接問題に対処していません。うーん、おそらく私はこれに答える代わりにこれを編集したはずです...
あなたは '<...文字、最初の尾をchar型のヘッド、CHAR>元のテンプレート'テンプレートを作成することにより、再帰を終了することができ、かつ終了のために 'template'を使用してください - しかし、あなたが求めているものではないと思います。 –
@BjörnPollexいいえ、2つの引数を渡すとあいまいです。パックは空にすることができます。 'テンプレート< char head >'と 'テンプレート'はこのトリックを行いますが、それは問題ではありません。 –
Potatoswatter