【问题标题】:C++ detect if type has template parameterC ++检测类型是否具有模板参数
【发布时间】:2019-02-07 17:42:45
【问题描述】:

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

例如:

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&lt;foo&gt; 为假,is_template_v&lt;bar&lt;int&gt;&gt; 为真,但我不能只用is_template_v&lt;bar&gt; 推断任何东西。或者,如果我定义

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

那么temp_check&lt;bar&gt; 完全有效,但我不知道如何类似地检查foo。如果它是有效的 C++,则需要这样的东西

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

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

【问题讨论】:

  • bar&lt;int&gt; 是一种特定类型。另一方面,bar 是一个模板。您可以同时检查两者,但您需要 is_template 的两个不同专业化才能这样做。

标签: c++ templates sfinae


【解决方案1】:

我会使用过载集的力量:

#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
}

让给用户:使用模板函数来提供一个 trait ;)

【讨论】:

  • 如果类型是类,这是一个很好的解决方案,但是如果 foobar 是函数,这种方法或类似方法是否可行?
  • @GregvonWinckel 不完全是。我建议使用一个带有调用运算符的类,因为操作类型比操作函数 pointres 容易得多
猜你喜欢
  • 1970-01-01
  • 2021-04-13
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 2022-06-30
  • 2010-09-11
  • 2022-01-01
相关资源
最近更新 更多