【C++】C++ template template typename class

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
发布了423 篇原创文章 · 获赞 14 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/LU_ZHAO/article/details/105480428
今日推荐