여기에 가능한 해결책이 있습니다 (C++ 11 이후 버전 - 글쎄, C++ 14에서는 작동하지만 에 대해서는 auto
대신 Base<T>
을 사용하면 C++ 11에서 사용) :
#include<utility>
#include<type_traits>
template<class T>
class Base{ };
template<class T>
class OtherRandomClass{ };
template<class T, class Other>
class Derived :
public virtual Base<T>,
public virtual OtherRandomClass<Other>
{ };
template<typename T>
constexpr auto f(const Base<T> &b) { return b; }
template<typename T>
struct S {
using type = decltype(f(std::declval<T>()));
};
int main() {
static_assert(std::is_same<typename S<Derived<int, double>>::type, Base<int>>::value, "!");
}
Derived
번 Base
에서보다 더 많은 상속 경우가 작동하지 않습니다. 실제로 한 번 Base
에서 상속 type
에만 T
경우가있다 하나는 심지어 enable_if
비슷하게 작동하는 클래스를 디자인 할 수 있습니다합니다 (void_t
관용구 같은) sfinae를 사용
.
template<typename T>
constexpr auto f(const Base<T> &b) { return b; }
template<typename...>
using void_t = void;
template<typename T, typename = void_t<>>
struct S { };
template<typename T>
struct S<T, void_t<decltype(f(std::declval<T>()))>> {
using type = decltype(f(std::declval<T>()));
};
이 구조체는 당신이 상상할 수있는 모든 템플릿 속임수에 대한 컴파일시에 사용할 수 있습니다
그것은 다음과 같은 형태를 가질 것이다.
두 경우 모두 S::type
(있는 경우)은 Derived
이 상속하는 기본 클래스 유형, 즉 Base<T>
입니다.
자세한 내용은 예제의 main
기능에서 static_assert
을 참조하십시오.
'유도'에 'typedef'를 입력하기 만하면됩니다. –
@ Cheersandhth.-Alf 그건 사실입니다 ....하지만 게으르다. 많은 코드를 다시 작성하고 싶지는 않다. (모두 내 허황이 될지도 모른다.) – DarthRubik
다른 가능한 모든' T '유형. 더 많은 일. –