2015-10-22 10 views

答えて

10

は、ここでは一般的なアプローチです。

+0

なぜstd :: arrayで動作しないのですか? –

+1

@Benoîtは値のテンプレートパラメータを持っているため、このクラスはこの場合に変更する必要があります。 – CoffeeandCode

+0

Hum。typename ...がタイプにしか拡張されていないという事実については一度も分かりませんが、これは明らかです。ありがとうございました。 –

7

はい、あなたは部分的な特殊化を使用してレビンダー単純なテンプレート加えることができます。

#include <memory> 
#include <vector> 

template <typename> struct vector_rebinder; 

template <typename T, typename A> 
struct vector_rebinder<std::vector<T, A>> 
{ 
    template <typename U> 
    using rebind = 
     std::vector<U, 
        typename std::allocator_traits<A>::template rebind_alloc<U>>; 
}; 

使用法:今すぐ

using T1 = std::vector<int>; 

using T2 = vector_rebinder<T1>::rebind<double>; 

T2std::vector<double>です。

template<typename...> struct rebinder; 

template<template<typename...> class Container, typename ... Args> 
struct rebinder<Container<Args...>>{ 
    template<typename ... UArgs> 
    using rebind = Container<UArgs...>; 
}; 

太陽の下で任意の容器のために動作します:@Kerrek SBの答えへに追加

+0

悲しいかな、これはベクタだけで動作します。テンプレートクラス、リスト、マップ、マイリストなどのために、それぞれのリバインダがなくても構いません。 – g24l

+0

一つの問題は、ベクトルの型を変更しますが、アロケータの型は変更しないことです。あなたのベクトルは、最初に 'int'型の値と' std :: allocator '型のアロケータを含んでいます。ここでは、値の型をdoubleに変更しますが、アロケータの型は変更しません。 値のタイプ:double アロケータのタイプ:std :: allocator 例http://coliru.stacked-crooked.com/a/2c8d57b2736947eeがエラーを示しています。私たちは標準を持っています:: vector > – Pumkko

+0

@Pumkko:ああ、それは確かにひどい考えです。私はそれを変更させてください。 –

関連する問題