代码之家  ›  专栏  ›  技术社区  ›  Greg von Winckel

C++检测类型是否具有模板参数

  •  2
  • Greg von Winckel  · 技术社区  · 6 年前

    我想统一一个接口来处理模板化类型和非模板化类型。是否有方法确定类型(如类或函数指针)是否依赖于模板参数?

    例如:

    struct foo {};
    template<typename T>  struct bar {};
    
    // This works if the template parameter is provided
    template<typename> struct is_templated : false_type {};
    template<template<typename...> class Obj, typename...Args>
    struct is_templated<Obj<Args...>> : true_type {};
    template<typename T> constexpr auto is_templated_v = is_templated<T>::value;
    

    在这种情况下, is_template_v<foo> 是假的 is_template_v<bar<int>> 是真的,但我不能用 is_template_v<bar> . 或者,如果我定义

    template<template<typename...> class> 
    struct temp_check : true_type {};
    

    然后 temp_check<bar> 是完全有效的,但我不知道我会如何类似地检查 foo . 需要的是这样的,如果它是有效的C++

    template<template<> class A> struct temp_check<A> : false_type {};
    

    是否有某种机制可以同时检查两者?

    1 回复  |  直到 6 年前
        1
  •  3
  •   YSC    6 年前

    我将使用过载装置的功率:

    #include <iostream>
    #include <type_traits>
    
    struct foo {};
    template<typename T>  struct bar {};
    
    template<template<class ...> class T, class... TArgs>
    constexpr bool is_template() { return true; }
    
    template<class T>
    constexpr bool is_template() { return false; }
    
    int main()
    {
        std::cout << is_template<foo>() << '\n'; // 0
        std::cout << is_template<bar>() << '\n'; // 1
    }
    

    让用户:使用模板函数提供特性;)