メンバー関数テンプレートのインスタンス化を停止する方法を学んでいます。c ++ 20では、requires句を使用してテンプレート引数に制約を設定し、これを使用してc ++ 20でのインスタンス化を停止できます。
このコードのc ++ 11/14/17のrequires句を置き換えることができるコード行はどれですか。
#include <iostream>
#include <string>
struct St {
template<typename T>
// C++11/14/17 ???
requires ( !(std::is_same<T, bool>::value || std::is_same<T, std::string>::value)) // C++20
constexpr auto increment_by_one(T targ) const noexcept { return targ+1; }
};
int main() {
St s;
std::cout << s.increment_by_one(5) << '\n';
std::cout << s.increment_by_one(8.6) << '\n';
std::cout << s.increment_by_one(6.6f) << '\n';
//std::cout << s.increment_by_one(true) << '\n';
//std::cout << s.increment_by_one(std::string("test string")) << '\n';
return 0;
}
タイプトレイトの使用std::enable_if
:
#include <type_traits>
// ...
template<typename T,
typename std::enable_if<
!(std::is_same<T, bool>::value || std::is_same<T, std::string>::value),
int
>::type = 0
>
constexpr auto increment_by_one(T targ) const noexcept -> decltype(targ+1) {
return targ+1; // ^^^^^^^^^^^^^^^^
} // trailing return type
を使用してauto
いる場合は、C ++ 14より前に末尾の戻り値の型を追加する必要があることに注意してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加