Re[6]: Медитировать на мультиметоды
От: pilot.net  
Дата: 25.06.15 06:08
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>От чего подход мультиметодов позволяет избавиться.

LVV>Я б разнес все же на два класса — с разными типами элементов.
Честно я не понимаю как это мне поможет
Мне нужен какой то механизм передачи методов в оператор мильтиметодов
У мeня есть много методов темплейтных типа:
template<class T0, class T1 >
void func1(QVector<T0> & , QVector<T1> & ,Variable & , Variable& )
template <class T>
T func0(T&)
template<class T>
Limit func2(const QVector<T> & , const Variable & ,const GraphicsScene & , const Variable&, Variable & ,bool )
template <class T>
T roundValue(T , int numberPrecision)

и мне надо избавится от проверок
if ( data.TypeData == ValueDouble)
    return func<double>(data.getDoubleValues())
else if ( data.TypeData == ValueFloat)
    return func<float>(data.getFloatValues())
Re: Посоветуйте
От: denisko http://sdeniskos.blogspot.com/
Дата: 25.06.15 08:23
Оценка:
Здравствуйте, pilot.net, Вы писали:
Засунь все в шаблонного уродца типа
struct FunctionHolder
{
    template<typename T>
    void operator()(T)
    {
        throw std::exception();
    }
};
    template<>
    void FunctionHolder::operator()<float>(float f)
    {
        std::cout << "i am float" << std::endl;
    }
    template<>
    void FunctionHolder::operator()<double>(double d)
    {
        std::cout << "i am double" << std::endl;
    }

enum Types
{
        zeroType,
        floatType,
        doubleType
};
template<Types t>
struct Caller
{
       ;
};

template<>
struct Caller<zeroType>
{
       template<typename Callee, typename ... Params>
       static void call(Types t, Callee callee, Params... params)
       {
            throw std::exception();
       }
};
template<>
struct Caller<floatType>: Caller<zeroType>
{
     template<typename Callee, typename ... Params>
     static void call(Types t, Callee callee, Params... params)
     {
        if(t == floatType)
            callee(params...);
        else
            Caller<zeroType>::call(t, callee, params...);
     }
};
template<>
struct Caller<doubleType>: Caller<floatType>
{
     template<typename Callee, typename ... Params>
     static void call(Types t, Callee callee, Params... params)
     {
        if(t == doubleType)
            callee(params...);
        else
            Caller<floatType>::call(t, callee, params...);
     }
};
struct CallerFinal:Caller<doubleType>
{
     template<typename Callee, typename ... Params>
     static void call(Types t, Callee callee, Params... params)
     {
        Caller<doubleType>::call(t, callee, params...);
     }
};
int main(int argc, wchar_t** argv)
{
    CallerFinal::call(floatType,FunctionHolder(), 1.0f);
    CallerFinal::call(doubleType,FunctionHolder(), 1.0);
}
<Подпись удалена модератором>
Отредактировано 25.06.2015 9:03 denisko . Предыдущая версия .
Re[5]: Посоветуйте
От: uzhas Ниоткуда  
Дата: 25.06.15 09:21
Оценка: 3 (1) +1
Здравствуйте, pilot.net, Вы писали:

U>>опишите подробнее, что хотите получить. лучше кодом покажите. откуда должны браться v и v1 мне неясно

PN>почти кусок кода:
<...>

в этом коде вам уже нужна двойная диспетчеризация
можно написать аналогичную функцию Dispatch2 : http://ideone.com/pYqgU1
я понимаю, что это плохо масштабируемый подход, но на практике иногда проще написать вспомогательные и не очень обобщенные функции. их назначение спрятать в себе череду if
Отредактировано 25.06.2015 9:36 uzhas . Предыдущая версия .
Re[6]: Посоветуйте
От: pilot.net  
Дата: 26.06.15 05:51
Оценка:
U>я понимаю, что это плохо масштабируемый подход, но на практике иногда проще написать вспомогательные и не очень обобщенные функции. их назначение спрятать в себе череду if
Класс, мне понравилось
А можно ли как-нибудь передать в структуру D2 метод который нужно выполнить ?
при вызове диспетчера int h2 = Dispatch2<int>(d1, d2, D2<int>(), ctx,78); ?
Re[2]: Посоветуйте
От: pilot.net  
Дата: 26.06.15 06:03
Оценка:
Здравствуйте, denisko, Вы писали:
D>int main(int argc, wchar_t** argv)
D>{
D> CallerFinal::call(floatType,FunctionHolder(), 1.0f);
D> CallerFinal::call(doubleType,FunctionHolder(), 1.0);
Как мне это вызвать без знания типов здесь ?

struct data
{
    typeData TypeData;
    vector<double> getDoubleValues() const { return vector<double>(); }
    vector<float> getFloatValues() const { return vector<float>(); }
};
......
data d1;
d1.TypeData = ValueDouble;
CallerFinal::call(FunctionHolder(), d1);
Re[3]: Посоветуйте
От: denisko http://sdeniskos.blogspot.com/
Дата: 26.06.15 09:07
Оценка: 3 (1) +1
Здравствуйте, pilot.net, Вы писали:
Вот так.
CallerFinal::call(d1.TypeData, FunctionHolder(), d1);
<Подпись удалена модератором>
Re[4]: Посоветуйте
От: pilot.net  
Дата: 26.06.15 09:19
Оценка:
Здравствуйте, denisko, Вы писали:
D>CallerFinal::call(d1.TypeData, FunctionHolder(), d1);
Спасибо. Чета туплю
Re[7]: Посоветуйте
От: uzhas Ниоткуда  
Дата: 26.06.15 09:29
Оценка:
Здравствуйте, pilot.net, Вы писали:

PN>А можно ли как-нибудь передать в структуру D2 метод который нужно выполнить ?


нельзя. тут важно понимать, что сам D2 является обработчиком. еще пример: http://ideone.com/LO27uy
вы можете func прямо в него и передвинуть. для каждой func нужен свой D2 =-)
Re[8]: Посоветуйте
От: pilot.net  
Дата: 26.06.15 09:48
Оценка:
U>нельзя. тут важно понимать, что сам D2 является обработчиком. еще пример: http://ideone.com/LO27uy
U>вы можете func прямо в него и передвинуть. для каждой func нужен свой D2 =-)
Я попробовал обернут D2 в макрос вроде работает http://ideone.com/8qsNmV
Re[9]: Посоветуйте
От: uzhas Ниоткуда  
Дата: 26.06.15 11:01
Оценка:
Здравствуйте, pilot.net, Вы писали:

PN>в макрос


заметьте, не я это предложил
успехов!
Re[10]: Посоветуйте
От: pilot.net  
Дата: 26.06.15 11:03
Оценка:
Здравствуйте, uzhas, Вы писали:
U>заметьте, не я это предложил
Да каюсь но это выход
Спасибо за помощь
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.