Я хочу сделать что-то вроде этого:
- Моя библиотека определяет структуру
LibStruct
- Клиенты библиотеки создают свои собственные структуры, которые как-то связаны (в примере , Я использовал наследование, но, возможно, есть лучший способ выражения)
- В библиотеке есть метод, который выполняет некоторые операции с использованием этих структур
- Избегайте вызовов виртуальных функций (жесткое требование) и избегайте объединения / вариантов (мягкое требование)
То, что я делал до сих пор, таково:
template <typename T /** And a bunch more **/>
struct LibStruct {
using Scalar = T;
// And a bunch more aliases
// Some data
};
template <typename T>
struct ClientStuctA : LibStruct<T> {
using Scalar = T; // Can this be avoided?
Scalar moreData;
};
struct ClientStuctB : LibStruct<double> {
using Scalar = double; // Can this be avoided?
Scalar otherData;
};
template <typename Whatever>
typename Whatever::Scalar doSomething(const Whatever& input) {
// Do stuff
return Whatever::Scalar();
}
Моя проблема в том, что все структуры клиента должны переопределять все псевдонимы. так что doSomething
может их использовать. Есть ли способ избежать необходимости в этом?
(запрашиваю C++14
, но если есть решение C++17
, я тоже его приму)