可変個引数関数を特定の数の入力(たとえば2つ)に制限したいと思います。そのため、これは私の環境(VS2017、C ++ 17)で正常に機能します:
#include <type_traits>
template<typename... T>
auto f(T...) -> typename std::enable_if<sizeof...(T) == 2>::type {
// no-op
}
int main() {
// f(1); // should fail
f(1,2);
// f(1,2,3); // should fail
}
しかし、エイリアステンプレートを導入しても、そうではありません。
#include <type_traits>
template<typename... T>
using two_params = typename std::enable_if<sizeof...(T) == 2>::type;
template<typename... T>
auto f(T...) -> two_params<T...> { // failed to specialize alias template
}
int main() {
// f(1); // should fail
f(1,2);
// f(1,2,3); // should fail
}
興味深いことに、条件を1
または実際に必要な入力数に変更すると、置換は成功します。
// This works, except that it permits a single argument even when it shouldn't.
// Both conditions ||'d together seems to be needed in the general case.
template<typename... T>
using two_params = typename std::enable_if<sizeof...(T) == 1 || sizeof...(T) == 2>::type;
のf(1,2)
2つの値を生成するようですsizeof...(T)
。ここで何が起こっているのですか?
私が見たいくつかの参考文献:
MicrosoftのJonathanEmmettは、これがコンパイラのバグであることを確認しました。
このレポートをありがとう。これがエイリアステンプレートとパック拡張のコンパイラバグであることを確認できます。現在、エイリアススペシャライゼーションの主要な修正セットに取り組んでおり、この作業は現在VS 201715.9リリースに含まれる予定です。このリワークの一環として、このバグが修正されていることも確認できます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加