7

私は、新しいinitializer_listバリアントがあり、 Variadic Templateバリアントがないという標準を読んminでいますか?maxminmax

したがって、これは問題ありません。

int a = min( { 1,2,a,b,5 } );

しかし、これはそうではありません:

int b = min( 1,2,a,b,5 ); // err!

多くの人は、可変個引数テンプレートがこれを簡単に実装できると期待しているので、がっかりするかもしれません。

VTを使用するのはやり過ぎだminと思いますmax

  • 可変個引数テンプレートは、複数のタイプを処理できます
  • 初期化リストは、すべてのタイプが設計上同じであることを確認します

したがって、ILはこのタスクにはるかに適しています。

私の解釈は正しいですか?

4

4 に答える 4

10

あなたの解釈は正しいです。 N2772には、より詳細な理論的根拠が含まれています。

于 2011-05-29T13:48:40.447 に答える
1

これは、GCC4.6でテストされたBoostConcepts CommonTypeTraitsの有無にかかわらず可変個引数テンプレートを使用した私のソリューションです。minただし、common_typeが必要かどうかはわかりません。

#define LessThanComparable class
#include <boost/type_traits/common_type.hpp>


/*! Multi-Type Minimum of \p a. */
template <LessThanComparable T> const T & multi_type_min (const T & a) { return a; } // template termination
/*! Multi-Type Minimum of \p a, \p b and \p args. */
template <class T, class ... R >
//requires SameType <T , Args >...
T multi_type_min(const T & a, const T & b, const R &... args)
{
    return multi_type_min(a < b ? a : b, args...);
}

/*! Minimum of \p a. */
template <LessThanComparable T> const T & min(const T & a) { return a; } // template termination
/*! Minimum of \p a, \p b and \p args. */
template <class T, class U, class ... R, class C = typename boost::common_type<T, U, R...>::type >
C min(const T & a, const U & b, const R &... c)
{
    return min(static_cast<C>(a < b ? a : b), static_cast<C>(c)...);
}
于 2011-09-19T13:58:07.693 に答える
0

はい、すべての値を互換性のあるタイプにすることで、リストがこの機能の適切な候補になると言っても過言ではありません。それはあなたがあなた自身の可変個引数テンプレートバージョンを書くことができなかったということではありません。

于 2011-05-29T13:45:02.290 に答える
0

可変個引数テンプレートとinitializer_listを組み合わせることで、int b = min( 1,2,a,b,5 );再帰的に展開せずに関数を機能させることができます。

template <class T>
T _real_min_(T a, std::initializer_list<T> s) {
    T *res = &a;
    for (auto it = s.begin(); it != s.end(); ++it) {
        *res = *(it) < *res ? *it : *res;
    }
    return *res;
}

template <class T, class... ArgTypes>
T min(T a, ArgTypes... args) {
  return _real_min_(a, {args...});
}
于 2018-09-10T05:52:47.670 に答える