gpt4 book ai didi

c++ - T 是 C++ 中模板的实例吗?

转载 作者:IT老高 更新时间:2023-10-28 21:42:18 24 4
gpt4 key购买 nike

假设我在一个模板中,我想知道类型参数 T 是否是特定模板的实例化,例如 std::shared_ptr:

template<typename T>
void f(T&& param)
{
if (instantiation_of(T, std::shared_ptr)) ... // if T is an instantiation of
// std::shared_ptr...
...
}

我更可能希望将这种测试作为 std::enable_if 测试的一部分:

template<typename T>
std::enable_if<instantiation_of<T, std::shared_ptr>::type
f(T&& param)
{
...
}

// other overloads of f for when T is not an instantiation of std::shared_ptr

有没有办法做到这一点?请注意,该解决方案需要使用所有可能的类型和模板,包括标准库和其他我无法修改的库中的类型和模板。我上面对 std::shared_ptr 的使用只是我可能想要做的一个例子。

如果可能,我将如何自己编写测试,即实现 instantiation_of

最佳答案

当简单的重载就足够了,为什么要使用enable_if

template<typename T>
void f(std::shared_ptr<T> param)
{
// ...
}

如果您确实需要这样的特性,我认为这应该可以帮助您入门(仅使用 VC++ 2010 进行了粗略测试):

#include <type_traits>

template<typename>
struct template_arg;

template<template<typename> class T, typename U>
struct template_arg<T<U>>
{
typedef U type;
};

template<typename T>
struct is_template
{
static T* make();

template<typename U>
static std::true_type check(U*, typename template_arg<U>::type* = nullptr);
static std::false_type check(...);

static bool const value =
std::is_same<std::true_type, decltype(check(make()))>::value;
};

template<
typename T,
template<typename> class,
bool Enable = is_template<T>::value
>
struct specialization_of : std::false_type
{ };

template<typename T, template<typename> class U>
struct specialization_of<T, U, true> :
std::is_same<T, U<typename template_arg<T>::type>>
{ };

关于c++ - T 是 C++ 中模板的实例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10821380/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com