3

fooこれらの線に沿った関数が欲しい

template <class T, class Alloc>
void foo(T param, Alloc a) {
    vector<int, Alloc<int> > vect_of_ints;
    list<float, Alloc<float> > list_of_floats;
    do_something()
}

std::allocator a
foo(42, a);

std::allocatorこれは失敗します。特定のタイプに特殊化されるまで、明確に定義されたタイプではないためだと思います。私がやりたいことをすることは可能ですか、しかし他の方法で。

4

1 に答える 1

4

アロケータ(a)のインスタンスを1つ持つことはできず、2つの異なるタイプで機能することを期待できます。ただし、アロケータジェネリック型(テンプレートテンプレートパラメータ)を使用して、2つの異なる方法でfoo()に特化することができます。とにかく、foo()で「a」を使用していません。

template <template<class> class Alloc, class T>
void foo(T t1, T t2) {
    vector<int, Alloc<int> > vect_of_ints;
    list<float, Alloc<float> > list_of_floats;
    do_something()
}

// UPDATE: You can use a function wrapper, and then the compiler will be
// able to figure out the other types.
template<class T>
void foo_std_allocator(T t1, T t2)
{
    foo<std::allocator, T>(t1, t2);
}


int main()
{
    //std::allocator a;
    //foo<std::allocator>();
    foo<std::allocator, int>(1, 2);

    // in the call below, the compiler easily identifies T as int.
    // the wrapper takes care of indicating the allocator
    foo_std_allocator(1, 2);

    return 0;
}
于 2012-11-01T06:47:28.230 に答える