Я надеялся, что CTAD будет работать с шаблонами псевдонимов, но это не так. У меня была идея использовать наследование, где конструктор производного класса является пересылающим (ничего не делает кроме вызывающей базы).
Это нормальное решение?
Есть ли лучшее решение (моя цель состоит в том, чтобы пользователям не приходилось указывать типы внутри <>)?
#include <iostream>
#include <type_traits>
template<typename T, bool is_mutable>
struct Ptr{
using PtrT= std::conditional_t<is_mutable, T*, const T*>;
Ptr(PtrT p): p_(p)
{
}
PtrT Get(){
return p_;
}
PtrT p_;
};
// CTAD does not work
// template<typename T>
// using MutPtr = Ptr<T, true>;
template<typename T>
struct MutPtr : public Ptr<T, true>{
MutPtr(T* p): Ptr<T, true>(p){}
};
int main()
{
MutPtr mp(new int{47});
(*mp.Get())++;
std::cout << *mp.Get() << std::endl;
}
Я с использованием последней версии MSVC / Clang, поэтому меня устраивают решения только на C ++ 20 (EDIT: если они реализованы в последней версии MSVC / Clang).