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

Gre*_*kel 6 c++ templates sfinae

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

例如:

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;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,is_template_v<foo>是假的,is_template_v<bar<int>>是真的,但我不能仅仅用 推断出任何东西is_template_v<bar>。或者,如果我定义

template<template<typename...> class> 
struct temp_check : true_type {};
Run Code Online (Sandbox Code Playgroud)

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

template<template<> class A> struct temp_check<A> : false_type {};
Run Code Online (Sandbox Code Playgroud)

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

YSC*_*YSC 7

我会使用过载集的力量:

#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
}
Run Code Online (Sandbox Code Playgroud)

让用户:使用模板函数提供一个特征;)

  • @GregvonWinckel 不完全是。我建议使用一个带有调用运算符的类,因为操作类型比操作函数指针容易得多 (2认同)