Например, у меня есть следующий код:
template<typename T, typename T2>
class a
{
public:
using myfl_t = float;
a(myfl_t fl, double db) {}
virtual void f()
{
std::cout << "a::f()\n";
}
};
template<typename T>
class b : public a<T, int>
{
using base_t = a<T, int>;
using myfl_t = typename base_t::myfl_t;
public:
b(myfl_t fl, double db)
: base_t(fl, db) {}
void f() override
{
std::cout << "b::f()\n";
}
};
Кажется, что я могу повторно использовать объявление myfl_t базового класса только путем дублирования использования в производном классе. Есть ли более простой способ сделать это?
Поскольку myfl_t
не зависит от параметра шаблона, вы можете переместить этот символ за пределы шаблона.
Вы можете поместить using
в b
и использовать это в конструкторе:
b(typename a<T, int>::myfl_t fl, double db)
В любом случае, ваш текущий код кажется мне хорошим. Вы действительно ничего не дублируете здесь. Дублирование было бы, если бы вам пришлось снова указать float
, что здесь не так, так что все в порядке.
Смотрите это по той причине, почему:
myflt_t
, определенный в class a
, не виден в class b
, как описано здесь: https://eli.thegreenplace.net/2012/02/06/зависимое-имя-поиск-для-c-шаблонов
Вы можете перевести myflt_t
в class b
без явного повторного объявления:
using typename base_t::myfl_t
Не уверен, что это обман, но объясняет, почему вы должны это сделать: stackoverflow.com/questions/1643035/…