2010-10-14 11 views
0

В настоящее время у меня есть класс, который использует аргументы шаблона. Мне нужен массив из них. Как я мог это сделать (без повышения). например:создание std :: vector шаблона класса?

template <typename RET, typename T> 
class AguiTimedEvent { 
    RET (*onEvent)(T arg); 
    double timeStamp; 
public: 
    RET call(T arg); 
    bool expired(); 
    AguiTimedEvent(); 
    AguiTimedEvent(RET (*Timefunc)(T arg), double timeSec); 
}; 

и я должен был бы что-то вроде:

AguiTimedEvent t<int, int>(func, 5.0); 
v.push_back(t); 
... 
v[0].call(); 

Я на самом деле не нужно возвращаемое значение, но я просто это сделать его более гибким. Если возвращаемое значение вызывает проблему, я могу ограничить ее функциями void, но вызывающе аргумент arg должен быть шаблонизирован. Что я могу сделать? Благодаря

* Мне нужен вектор для обработки любого типа, мне нужен массив, в котором массив может направить события XY, а не только Int Int

+0

я подозреваю, вы имели в виду, чтобы указать вам не заботиться о типе возвращаемого * поэтому вектор должен обрабатывать события различных типов возврата * ? – GManNickG

+0

@GMan да, и произвольных типов аргументов тоже – jmasterx

+0

Вы действительно изучаете повторное создание Boost.Function, Boost.Bind и/или Boost.Signals. Лучше всего либо использовать их, либо смотреть на него, и переписывать его самостоятельно. – GManNickG

ответ

2
std::vector<AguiTimedEvent<int, int> > v; 

Если вам нужно хранить объекты разных AguiTimedEvent типов которые имеют разные аргументы шаблона, вам нужно создать базовый класс (например, AguiTimedEventBase) и сохранить указатели в vector.

+0

Обратите внимание на дополнительное пространство между «>>», иначе ваш компилятор не будет читать его правильно. – dutt

+2

Grumble, +1, но я только повышаю вас выше в списке лучших пользователей, чем я. > :(Мне нужно передать вас. :) – GManNickG

+1

@GMan: Ха-ха. Хорошо, хорошие новости для вашей позиции в списке за все время: теперь, когда C++ больше не является моим самым часто используемым языком, я ожидаю, что мое участие в [C++] уменьшится (как только я перестану стучать головой на свой стол интересно, почему C# не может быть немного больше похожим на C++: -D). –

0

я не сталкивался с проблемой со следующим кодом:

template <typename RET, typename T> 
class AguiTimedEvent { 
    RET (*onEvent)(T arg); 
    double timeStamp; 
public: 
    RET call(T arg) {return 0;} 
    bool expired() {} 
    AguiTimedEvent() {} 
    AguiTimedEvent(RET (*Timefunc)(T arg), double timeSec) {} 
}; 

int func(int x) {return 0;} 

int main() 
{ 
    vector< AguiTimedEvent<int, int> > v; 
    AguiTimedEvent<int, int> t(func, 5.0); 

    v.push_back(t); 

    return 0; 
} 
+0

Но что, если его не int int, мне нужен вектор для обработки любого типа – jmasterx

+0

@Milo, вы имеете в виду, что один вектор должен содержать несколько типов? Я не думаю, что это возможно. – Donotalo

+0

@ Donotalo Каким будет способ добиться такого же эффекта? – jmasterx

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