27

の一部の型変換は、<type_traits>コア言語構文を使用して表現することもできます (たとえばstd::add_const<T>::type、 is/seems と同等ですconst T)。std::add_lvalue_reference、およびおそらく他の人のためのDtto 。これらの型特性の用途は何ですか?

標準がそれらなしで「不完全なツールボックス」を提供することになることを完全に理解しており、次のようなメタ的な方法での使用を想像できます。

template<typename In, template <typename> class Modifier>
struct Apply {
  typedef typename Modifier<T>::type Out;
};

Apply<int, std::add_const>

構文的に表現できるこれらの特性の他のユースケースはありますか、それとも「完全性の意味から」時折のメタユースのために含まれているだけですか?

4

4 に答える 4

1

私が知っている唯一の使用例を以下に示します。

struct F
{
    bool f() const { return true; }
    bool f() { return false; }
};
assert(!F{}.f())
assert(std::add_const_t< F >{}.f());

また、 cv-ref 修飾されたメンバー関数機能のテストにも必要でした。これは、オーバーロードによって異なる場合があります (lref 修飾された最新の C++ には便利なstd::as_const機能がある場合のみ)。

struct F
{
    int g() & { return 1; }
    int g() const & { return 2; }
    int g() && { return 3; }
    int g() const && { return 4; }
};
F f;
assert(f.g() == 1);
assert(std::as_const(f).g() == 2);
assert(F{}.g() == 3);
assert(std::add_const_t< F >{}.g() == 4); // rarely needed, but if needed, then it helps
于 2016-02-21T21:14:37.083 に答える