2015-08-22 3 views
0

Я хочу создать класс шаблона для общих операторов. Класс будет иметь два представляющие структуры значения в качестве входных данных:Функция шаблона в качестве параметра шаблона

struct Value { 
    DataType type; 
    size_t dataSize; 
    char* data;  
}; 

Я уже написал тип вычет с OLDSCHOOL включений случаев. После броска из-данных PTR к типу, я хочу, чтобы применить операцию на входных значений, как это:

template<class Operation> 
class ApplyOperation { 
    Value* operator()(const Value* a, const Value* b) const { 
    //find type of a and b 
    //cast a and b to their types 
    Operation<aT,bT> op; 
    return op(a,b); 
    } 
}; 

Теперь я мог бы написать для каждой операции немного-структуру, как это:

template<class A, class B> 
struct Add { 
    A operator()(A a, B b) const { return a + b; } 
}; 

Я видел класс буксировки под названием операторов: http://www.boost.org/doc/libs/1_59_0/libs/utility/operators.htm

который я хочу использовать для своей цели. Но я не знаю, как его интегрировать, поскольку операторы в структурах не являются функторами. Так было бы возможно использовать его как это ?:

ApplyOperation<boost::addable::operator+> add; 
add(a,b); 

На самом деле я пытаюсь его для тестирования с этим классом:

template<template<class T, class U, class...> class OperatorClass,class F> 
struct ApplyOperator { 

    template<class T, class U> 
    T foo(T a, U b) { 
     OperatorClass<T,U> opClass; 
     return opClass.operator+(a,b); //this works of course 
    } 
}; 

То, что я хочу, чтобы это:

template<template<class T, class U, class...> class OperatorClass,class F> 
struct ApplyOperator { 

    template<class T, class U> 
    T foo(T a, U b) { 
     OperatorClass<T,U> opClass; 
     return opClass.F(a,b); 
    } 
}; 

конкретизированных так:

ApplyOperation<boost::addable, operator+> add; 

Это не работает, конечно, из-за неизвестного оператора типа +. Итак, как я могу вызвать оператор + -функция с шаблонами?

Есть ли способ решить эту проблему?

+1

Пожалуйста, напишите [mcve] того, что вы пытаетесь сопутствовать –

+0

http://pastebin.com/yihHAMR0 – Paul

ответ

0

Я не уверен, что полностью понял вопрос. Но похоже, что вы пытаетесь предоставить экземпляр объекта (а не тип) для вашего шаблона ApplyOperator. Поскольку оператор + определенно не является типом, а не интегральной константой, он не может быть использован как шаблонный аргумент никоим образом. Что вам нужно сделать, так это сделать операцию аргументом для конструктора, а не типа объекта.

+0

Есть ли способ рассказать через шаблоны, какую функцию-член использовать? – Paul

+0

№. Только 2 вещи, которые могут быть аргументом шаблона, являются константой типа или интеграла. Указатели функций не являются. – SergeyA

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