Шаблон функции как параметр к шаблону класса - PullRequest
1 голос
/ 28 октября 2010

<> - прочитать это как шаблон;

Я могу сделать это:

void f() {}

//Here I'm declaring a fnc as a <> param
template<void (*fnc)()>
struct Factor { };

int main()
{
  Factor<f> fac;
  return 0;
}

, но я не могу сделать это:

#include <sstream>

template<class R, class T>
R make_(T first, T second)
{
    std::stringstream interpreter;
    R result = R();
    interpreter << first << '.' << second;
    interpreter >> result;
    return result;
}

//Here I'm (trying) to declare fnc <> as a <> param
template<template<class T,class R> R (*fnc)(T,T)>
struct Factor { };

int main(int argc, char* argv[])
{
  Factor<make_> fac;
  return 0;
}

BIG Qявляется: Как (если возможно) я могу объявить в качестве параметра шаблона шаблон fnc?

Редактировать

При условии, что я использовал совет Армена: Я хотел быбыть в состоянии сделать что-то вроде этого (в основном):

Factor<f<"1","02">> m;

Тогда в m я мог бы сделать двойной тип из этих аргументов ("1", "02")

Ответы [ 3 ]

1 голос
/ 28 октября 2010

Ваш синтаксис имеет некоторые проблемы.То, что вы делаете в конце с Factor<make_> fac;, похоже на объявление vector<map> v; Вам необходимо предоставить параметры для шаблона, чтобы сделать его конкретным: Factor<make_<int,int> > fac;.Но это еще не все;их много.

То, что вы делаете со своей функцией, не совсем правильно.Вы предоставляете определенную функцию (f в первом примере), которая может быть выполнена в качестве параметра конструктора.Вам следует пересмотреть свой дизайн.

1 голос
/ 28 октября 2010

Нет синтаксиса для этого в C ++. Что вы должны сделать, это вместо шаблона функции использовать шаблон функтора, который будет соответствовать параметру шаблона шаблона.

Е.Г.

template <class R, class T>
struct f
{
    R operator () (T const&)
    {
        //blah
    }
};

template <template<class R, class T> class F >
struct foo
{
    ///...
};

int main()
{
    foo<f> d;
}
0 голосов
/ 29 октября 2010

Из вашего шаблона функции make_() кажется, что вы действительно хотите boost::lexical_cast<>().Он делает то, что делает ваш make_(), только лучше.(Для начала ваше преобразование вообще не проверяет наличие ошибок.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...