2010-10-31 4 views
1

В коде:Как передать аргументы конструктору политики?

template<class T> 
struct FactorPolicy 
{ 
    T factor_; 
    FactorPolicy(T value):factor_(value) 
    { 
    } 
}; 

template<class T, template<class> class Policy = FactorPolicy> 
struct Map 
{ 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
     Map<int,FactorPolicy> m;//in here I would like to pass a double value to a 
//FactorPolicy but I do not know how. 
     return 0; 
    } 

Edited [для Mark H]

template<class T, template<class> class Policy = FactorPolicy> 
struct Map : Policy<double> 
{ 
    Map(double value):Policy<double>(value) 
    { 
    } 
}; 
+0

Зачем вам это нужно? –

+0

@Alexey, если вы посмотрите на ctor FactorPolicy, нужно передать аргумент, и я хотел бы иметь возможность передать это значение при объявлении переменной Map. Что-то вроде этого: Map

ответ

0

Одним из способов является создание шаблонов функций члена, которые принимают шаблон ARG для использования с политикой. Например:

template<class T, template<class> class Policy = FactorPolicy> 
struct Map 
{ 
    template <typename V> 
    void foo(const Policy<V> &p) 
    { 
    } 
}; 

Затем в основной:

Map<int,FactorPolicy> m; 

m.foo(FactorPolicy<double>(5.0)); 

Другая возможность заключается в том, чтобы указать его в качестве части карты шаблона конкретизации, путем добавления третьего шаблона ARG к карте:

template<class T, template<class> class Policy = FactorPolicy, 
     class V = double> 
struct Map 
{ 
    void foo(const V &value) 
    { 
    Policy<V> policy(value); 
    } 
}; 

Затем:

Map<int,FactorPolicy,double> m; 

m.foo(5.0); 
+0

@Michael no Я этого не делал, это шаблонный шаблонный класс –

+0

ОК, так же, как я указал для вас, функция _tmain работает? Поскольку в нижней строке вы не можете определить переменную без указания всех (фактических) шаблонных аргументов. –

+0

@ Майкл к вашему обновлению, я не уверен на 100%, но если я объявлю шаблон шаблона, мне не нужно предоставлять параметры в шаблоне decl. Но, как я уже сказал, я не уверен на 100%. –

0

Если вам нужно было пройти двойное, это потребовало бы, чтобы аргумент типа FactorPolicy был двойным внутри карты, если только вы не создадите конструктор FactorPolicy, чтобы принять double. Я не думаю, что это то, что вы хотите. Вы должны сообщить Карте, что для Политики требуется двойной, поэтому сначала добавьте этот аргумент типа. Во-вторых, я думаю, вам нужно будет перенаправить фактическое двойное значение из конструктора Map.

template<class T, typename U, template<class> class Policy = FactorPolicy > 
struct Map { 
    Map(U val) { 
     policy_ = new Policy<U>(val); 
    } 

    Policy<U>* policy_; 
}; 

int main() 
{ 
    Map<int, double, FactorPolicy> m(5.63); 
    return 0; 
} 
+0

@Mark, если я хочу передать значение фактора в ctor, я бы сделал это еще проще - вам не нужно указывать тип U. –

+0

Для того, что вы утверждаете, вам нужно определить его как 'template >'. Иначе как Map будет знать, что FactorPolicy нужен двойной? Он не может просто вывести это из типа аргумента, вы должны явно указать тип где-то. –

+0

@Mark дать мне сек –

Смежные вопросы