template <template <typename> class Extract, typename Obj, typename Default,
typename>
struct ExtractOr {
using type = Default;
};
看模版又看到一个写法。。
https://stackoverflow.com/questions/213761/what-are-some-uses-of-template-template-parameters
示例:
#include <iostream>
#include <memory>
#include <typeinfo>
#include <cstddef>
#include <limits>
#include <new>
#include <type_traits>
#include <utility>
template <typename Based, typename Derived, bool = (std::is_class<Based>::value && std::is_class<Derived>::value)>
class is_base_of
{
template<typename T>
static char helper(Derived, T) {};
static int helper(Based, int) {};
struct Conv
{
operator Derived();
operator Based() const;
};
public:
static const bool value = sizeof(helper(Conv(), 0)) == 1;
};
template<typename Based, typename Derived>
class is_base_of<Based, Derived, false>
{
public:
static const bool value = std::is_same<Based, Derived>::value;
};
template <template <typename, typename, bool> class T, typename Based, typename Derived>
class base_of {
public:
static const bool value = T<Based, Derived, (std::is_class<Based>::value && std::is_class<Derived>::value)>::value;
};
class A {};
class B : public A {};
class C {};
int main() {
std::cout << base_of<is_base_of,A,B>::value << std::endl;
std::cout << base_of<is_base_of,A,C>::value << std::endl;
std::cout << base_of<is_base_of,int,int>::value << std::endl;
std::cout << base_of<is_base_of,int,double>::value << std::endl;
return 0;
}
输出结果为:
:g++ -std=c++14 main.cc -o main
:./main
1
0
1
0