Я работаю над функцией-членом Component
класса Component::connect()
. Component
- абстрактный базовый класс для всех других типов компонентов в моей библиотеке.
Сейчас я модифицирую этот метод, чтобы использовать Variadi c Шаблоны функций и SFINAE, чтобы разрешить неизвестные множественные входные данные в эту функцию ... Все входные данные должны быть производными от типа Component
.
У меня проблемы с синтаксисом его объявления, а также с его реализацией ... Я пробовал разные вещи при получении различных ошибок компилятора. Это может иметь какое-то отношение к расширению пакета параметров или к тому, как я пытаюсь использовать SFINAE в его сигнатуре.
Вот текущая сигнатура моего класса и функции, над которыми я работаю ...
class Component {
protected:
std::string id_ = "";
std::list<std::shared_ptr<Component>> components_;
explicit Component(const std::string& id) : id_{ id } {}
public:
virtual ~Component() {}
std::string& id() { return id_; }
// Trying to use both Variadic Function Template and SFINAE for this function!
// I may eventually remove this from here and move it to another class using CRTP...
template<typename ... Args, std::enable_if_t <std::is_class<Args...>{}, Component> = 0 >
void connect(Args&& ...args) {
for (auto& l : components_) {
if (args->id_ == l->id()) {
std::cout << "Component " << (args->id_) << " already exists in " << id_ << "!\n";
return;
}
}
components_.push_back( std::make_shared<Component>( args... ) );
std::cout << "Successfully connected " << args->id() << " to " << id_ << "\n";
}
virtual std::list<std::shared_ptr<Component>> myConnections() { return components_; }
virtual void propagate() {};
};
Каким будет правильный синтаксис для успешной компиляции этого в Visual Studio 2017 с использованием C ++ 17? Я пытаюсь использовать оба шаблона функций Variadi c с использованием SFINAE.
Edit
До того, как я изменил свою подпись, производные классы, такие как как Wire
, производные от Component
, я мог использовать их следующим образом:
Wire w1, w2, w3, w4;
w1.connect(&w2);
w1.connect(&w3);
w1.connect(&w4);
w2.connect(&w3);
w2.connect(&w4);
Я хотел бы использовать ту же функцию, но таким образом:
w1.connect(&w2, &w3, &w4);
Вот почему я хочу использовать шаблон функции Variadi c и почему я хочу использовать SFINAE, чтобы убедиться, что любой тип, переданный в ::connect()
, в котором все производные классы могут его использовать, фактически является производным с Component
!