2016-05-03 3 views
1

В этом примере я создаю класс Functor, который выполняет функции в качестве параметров. Второй функтор должен взять объект первого функтора в качестве параметра шаблона и вызвать функцию первого функтора. Я не знаю, как должен выглядеть шаблон для второго Functor.Класс шаблона в качестве параметра класса шаблона

Это первая Functor, который работает, как ожидалось:

typedef float (*pDistanceFu) (float, float); 
typedef float (*pDecayFu) (float, float, float); 

template <pDistanceFu Dist, pDecayFu Rad, pDecayFu LRate> 
class DistFunction {  
public: 
    DistFunction() {} 
    DistFunction(char *cstr) : name(cstr) {}; 

    char *name; 
    float distance(float a, float b) { return Dist(a,b); }; 
    float rad_decay(float a, float b, float c) { return Rad(a,b,c); }; 
    float lrate_decay(float a, float b, float c) { return LRate(a,b,c); }; 
}; 

Здесь я создаю экземпляр функтора, который является специализированным:

DistFunction<foo,bar,foobar> fcn_gaussian((char*)"gaussian"); 

Здесь я не знаю, как шаблон должен выглядеть, использовать любой тип DistFunction < ...> как параметр

template<template<DistFunction> typename = F> 
struct functor { 
    float fCycle; 
    float fCycles; 

    functor(float cycle, float cycles) : fCycle(cycle), fCycles(cycles) {} 

    float operator()(float lrate) { 
    return (F.lrate_decay)(lrate, fCycle, fCycles); 
    } 
}; 

Как я хочу использовать второй функтор:

typedef DistFunction<foo,bar,foobar> gaussian; 
void test() { 
    functor<gaussian> test(0,1); 
} 

ошибки:

error: argument list for class template "DistFunction" is missing 
error: expected "class" 
error: expected a "," or ">" 
+0

Как вы будете использовать «функтор»? 'Функтор '? – songyuanyao

+0

Обновлен вопрос, возможно, невозможно, что компилятор получает информацию о шаблоне с объекта .., я думаю, – dgrat

+0

Кто предоставляет объект-функтор? –

ответ

2

Это безымянный параметр шаблона шаблон с си ngle non-type типа DistFunction и значение по умолчанию F. Поскольку DistFunction не является типом (это шаблон класса) и F не существует, это не имеет смысла.

Здесь вам не нужны параметры шаблона шаблона. Простой

template<typename F> 
struct functor { 

должен выполнить эту работу.

Если вы хотите ограничить F, то есть, только позволяет ей принимать различную инстанциацию DistFunction и ничего, вам нужны различные объекты языка, такие как static_assert и/или enable_if. Это необходимо только для улучшения сообщений об ошибках в случае, если кто-то неверно идентифицирует functor. Просто используйте F, как будто это DistFunction.

+0

Вы были правы. Моя ошибка заключалась в том, что я забыл конструктора. Создание элементов статичным, даже мой тестовый код работает. Я настолько тупой. – dgrat

2

Попробуйте

template<typename F> 
struct functor { 
    float fCycle; 
    float fCycles; 

    functor(float cycle, float cycles) : fCycle(cycle), fCycles(cycles) {} 

    float operator()(float lrate) { 
    return F((char*)"gaussian").lrate_decay(lrate, fCycle, fCycles); 
    } 
}; 

LIVE

+0

Это не удается, потому что lrate_decay неизвестен. Кроме того, я хочу избежать создания среды DistFunction во время выполнения. – dgrat

+0

@dgrat Тогда вам нужно создать его каждый раз, когда вызывается 'operator()' 'functor'. – songyuanyao

+0

Это ничего не отрицает, вы не вызываете 'test.operator()'. –

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