Я пытаюсь переписать шаблонный шаблон http://docs.ros.org/hydro/api/rviz/html/c++/message__filter__display_8h_source.html, который будет использоваться с несколькими типами сообщений, используя вариативные шаблоны.Наследование шаблона Variadic, перегрузка функции-члена
Моя первая проблема была, как я могу переписать пример кода ниже, используя VARIADIC шаблонов, поэтому он может быть использован с произвольным числом аргументов шаблона, а не только 2.
Что мне нужно в родительском классе:
- функция члена виртуальной
processMessage
для каждого шаблонного типа - функции-члена для каждого
incomingMessage
для каждого шаблонного типа - переменного для каждого члена шаблонного станда е. (Позже будет на подписчика для темы этой MessageType в ROS)
Так что, если вызывается, например, с 2-шаблонных типов, то VARIADIC базовый класс должен составить что-то вроде этого:
Включает:
#include<string>
#include<sstream>
#include<iostream>
using namespace std;
рабочий код (обычные шаблоны):
template<class MessageType1,class MessageType2> class Parent{
public:
Parent() : messages_received_(0){}
virtual void processMessage(MessageType1 msg) = 0;
virtual void processMessage(MessageType2 msg) = 0;
void incomingMessage(MessageType1 msg){
processMessage(msg);
incr();
}
void incomingMessage(MessageType2 msg){
processMessage(msg);
incr();
}
private:
void incr(){
cout<<"received "<<++messages_received_<<endl;;
}
MessageType1 sub1_;
MessageType2 sub2_;
int messages_received_;
};
Не работает (VARIADIC):
template<class... Elements> class Parent;
template<> class Parent<>{};
template<class Head, class... Tail> class Parent<Head, Tail...> : public Parent<Tail...> {
public:
Parent() : messages_received_(0){}
virtual void processMessage(Head msg) = 0;
void incomingMessage(Head msg){
processMessage(msg);
incr();
}
private:
void incr(){
cout<<"received "<<++messages_received_<<endl;;
}
Head sub1_;
int messages_received_;
};
компиляция завершилась с:
g++ variadic.cpp --std=c++0x
variadic.cpp: In function ‘int main()’:
variadic.cpp:52:33: error: invalid conversion from ‘int’ to ‘const char*’ [-fpermissive]
/usr/include/c++/4.6/bits/basic_string.h:485:7: error: initializing argument 1 of ‘std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, const _Alloc&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]’ [-fpermissive]
Так что я думаю, что каким-то образом, функция член processMessage
только компилируется processMessage(std::string s)
и не перегруженной версии processMessage(int a)
;
Пример использования:
class Child : public Parent<std::string, int> {
public:
void processMessage(std::string msg){
cout<<"string: "<<msg<<endl;
}
void processMessage(int msg){
cout<<"int: "<<msg<<endl;
}
};
int main()
{
Child myMfd;
myMfd.incomingMessage(42);
myMfd.incomingMessage("abc");
return 0;
}
Как исправить эту проблему?