Является ли наследование вместо псевдонима шаблона хорошим способом заставить работать вывод аргументов шаблона класса? - PullRequest
0 голосов
/ 16 июня 2020

Я надеялся, что 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).

...