2

以下の文について混乱しています。変換メンバー関数に使用された例は理解していますが、コンストラクターメンバー関数テンプレートの機会を理解していません。Mankarse が提供する役立つ例です

明示的なテンプレート引数リストは関数テンプレート名の後に続き、変換メンバー関数テンプレートとコンストラクター メンバー関数テンプレートは関数名を使用せずに呼び出されるため、これらの関数テンプレートに明示的なテンプレート引数リストを提供する方法はありません。 --14.5.2.5 N3242

struct A {
    template <class T> operator T*();
};
template <class T> A::operator T*(){ return 0; }
template <> A::operator char*(){ return 0; } // specialization
template A::operator void*(); // explicit instantiation

int main() 
{
   A a;
   int *ip;
   ip = a.operator int*(); // explicit call to template operator
   // A::operator int*()
}

クラス テンプレートのメンバー関数のテンプレート引数は、メンバー関数が呼び出されるオブジェクトの型のテンプレート引数によって決まります。--14.5.1.1.2 N3242

したがって、テンプレート引数を自分で差し引くか、ラッパーを使用する必要があります。
標準ライブラリを読み取るときに libstdc++ によって与えられる例:

template<typename _Container>
class back_insert_iterator
: public iterator<output_iterator_tag, void, void, void, void>
{
   protected:
      _Container* container;
   public:
       explicit
       back_insert_iterator(_Container& __x) : container(&__x) { }
}
/*
 *it use a wrapper :
 */
template<typename _Container>
inline back_insert_iterator<_Container>
back_inserter(_Container& __x)
{ return back_insert_iterator<_Container>(__x); }
4

2 に答える 2

1

中間テンプレート クラスを使用して、ctor への明示的なパラメーターを作成できます。これにより、目的の型が推測されます。

#include <iostream>
using namespace std;

template <typename T> struct tag { using type = T;};

class My {
public:
    template <typename T> My(tag<T>) {
        cout << "ctor of " << typeid(T).name();
    }
};

int main(int argc, const char * argv[]) {

    auto a = My(tag<int>());
}
于 2016-04-28T16:55:37.313 に答える