- type_traits[meta header]
- std[meta namespace]
- class template[meta id-type]
- cpp17[meta cpp]
namespace std {
template <class Trait>
struct negation;
template <class Trait>
inline constexpr bool negation_v = negation<Trait>::value;
}
特性(bool
値を返すメタ関数)の論理否定を計算する。
型引数Trait
はbool
に変換可能なメンバ変数value
を持つこと。
bool_constant<!Trait::value>
から派生する。
すなわち、Trait::value == true
ならばfalse_type
から派生し、Trait::value == false
ならばtrue_type
から派生する。
主にconjunction
、disjunction
のような、結果となる::value
ではなくメタ関数そのものを受け取る高階メタ関数の引数において結果の真理値を反転させたいときに利用する。
#include <type_traits>
#include <iostream>
#include <memory>
template<typename T>
void f() {
std::cout << std::boolalpha << "T::value = " << T::value << std::endl;
}
//型Tがムーブ構築のみが可能かどうかを調べる(is_move_constructible == true && is_copy_constructible == false)
template<typename T>
using is_only_move = std::conjunction<std::is_move_constructible<T>, std::negation<std::is_copy_constructible<T>>>;
int main()
{
f<std::true_type>();
f<std::negation<std::true_type>>();
f<is_only_move<std::unique_ptr<int>>>();
}
- std::negation[color ff0000]
- std::true_type[link true_type.md]
- std::is_move_constructible[link is_move_constructible.md]
- std::is_copy_constructible[link is_copy_constructible.md]
- std::conjunction[link conjunction.md]
T::value = true
T::value = false
T::value = true
template <class Trait>
struct negation : bool_constant<!Trait::value> {};
- C++17
- Clang: 3.8
- GCC: 6.3
- Visual C++: 2015 update2, 2017
negation_v
は、2015ではインテリセンスからは見えないが利用可能である。