Как передать аргументы конструктору политики? - PullRequest
1 голос
/ 31 октября 2010

В коде:

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;
    }

Отредактировано [для знака H]

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

Ответы [ 2 ]

0 голосов
/ 31 октября 2010

Если вы передадите double, потребуется, чтобы аргумент типа FactorPolicy был двойным внутри Map, если вы не заставите конструктор FactorPolicy принимать double. Я не думаю, что это то, что вы хотите, хотя. Вы должны сообщить Map, что для Политики требуется двойное значение, поэтому сначала добавьте аргумент типа. Во-вторых, я думаю, вам нужно переслать фактическое значение типа 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 голосов
/ 31 октября 2010

Одним из способов является предоставление шаблонов функций-членов, которые принимают шаблон 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));

Еще одна возможность - указать его как часть создания шаблона карты, добавив третий аргумент шаблона в Map:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...