7

using次のような状況では、(または他の方法で)型エイリアスを使用する必要があります。

template <class T>
typename std::enable_if< /*HERE*/>::value
f (...) {};

私が書いたところにはHERE、構造内で定義された長い型と複数の型があり、書く代わりにtypename <very long templated struct dependent on T>::typeショートカットを書きたいと思います。

そして、テンプレートの特殊化や接尾辞の戻り値の構文など、より多くの状況でこれに遭遇しました。それで、最初の行と構造体/クラスまたは関数のusing間の場所で(しゃれた意図なしで)使用する方法はありますか?.template <...>

,(カンマ) のようなものを使用してみましたが(using X = ... , /*actually using X*/)、成功しませんでした。

機能したのはグローバルスコープでしたusing

template <class Iterator>
using DT = typename DereferenceType<Iterator>::type&;

しかし、グローバル スコープは必要ありません。使用するテンプレートだけにスコープを適用したいのです。そして、私は書きたくありませDT<Iterator>DT

言うまでもなく、マクロやプリプロセッサ ディレクティブは問題外です。


実際の例:

template <class Iterator, class GetCompValue, class SortOrder = Ascending>
typename std::enable_if<
    IsDereferenceable<Iterator>::value &&
    IsCallableLike<GetCompValue,
                   typename DereferenceType<Iterator>::type&(
                      typename DereferenceType<Iterator>::type&)>::value &&
    IsSortOrder<SortOrder>::value, void>::type
RadixSortLSDByteOffsetIter(Iterator first, Iterator last,
                           GetCompValue get_comp_value, SortOrder = kAscending) {

typename DereferenceType<Iterator>::type&ここで、次のようなショートカットが必要です。

template <class Iterator, class GetCompValue, class SortOrder = Ascending>
// using DT = typename DereferenceType<Iterator>::type&;
typename std::enable_if<
    IsDereferenceable<Iterator>::value &&
    IsCallableLike<GetCompValue, DT(DT)>::value &&
    IsSortOrder<SortOrder>::value, void>::type
RadixSortLSDByteOffsetIter(Iterator first, Iterator last,
                           GetCompValue get_comp_value, SortOrder = kAscending) {

ありがとうございました。

4

2 に答える 2

0

新しい型を定義してエイリアスを作成してみませんか?

struct alias : long-long-typename {}
于 2013-12-27T12:36:47.310 に答える