template<typename T, int V>
class AwesomeClass // [1]
{
public:
AwesomeClass(T baseValue)
: m_value(baseValue + V)
{
}
T get() const
{
return m_value;
}
private:
T m_value;
};
#ifdef USE_ALIAS_TEMPLATES // [2]
template<typename T>
using AwesomeClassWithOne = AwesomeClass<T, 1>;
template<typename T>
using AwesomeClassWithTwo = AwesomeClass<T, 2>;
#else // [4]
template<typename T>
class AwesomeClassWithOne: public AwesomeClass<T, 1>
{
using AwesomeClass<T, 1>::AwesomeClass;
};
template<typename T>
class AwesomeClassWithTwo: public AwesomeClass<T, 2>
{
using AwesomeClass<T, 2>::AwesomeClass;
};
AwesomeClassWithOne(int) -> AwesomeClassWithOne<int>;
AwesomeClassWithTwo(int) -> AwesomeClassWithTwo<int>;
#endif
int main()
{
AwesomeClassWithOne firstObj(20); // [3]
AwesomeClassWithTwo secondObj(20);
return firstObj.get() + secondObj.get();
}
나는 두 개의 템플릿 매개 변수 typename T
과 int V
을 사용하는 클래스 AwesomeClass
[1]을 가지고 있습니다. V
은 클래스의 사용자에게 공개하고 싶지 않은 내부 세부 정보이므로 AwesomeClassWithOne
및 AwesomeClassWithTwo
과 같은 별칭을 제공하려는 경우 T
을 템플릿 매개 변수로 사용하고 V
은 이미 일부 값 (1 내 예에서는 각각 2).별칭 템플릿 또는 특수 파생 클래스?
별칭 템플릿이이 [2]에 적합하다고 보입니다. 그러나 C++ 17부터는 별칭 템플릿에 인수 차감을 사용할 수 없기 때문에 [3] 할 수 없습니다.
그래서 내가 원하는 "별칭"유형마다 새 파생 클래스를 만들고 기본 클래스의 모든 생성자를 상속 한 다음 자동 공제 작업을 수행하는 공제 안내서를 만듭니다 (기본 클래스 생성자는 일반 생성자처럼 자동 공제 가이드가 나타나지 않는 것 같습니다 (related question).
이 방법이 적절한 해결 방법으로 보입니까? 별칭 템플릿 솔루션과 비교하여 이상한 부작용을 예상 할 수 있습니까?