c++ 如何确定一个类型是否是某个特定类型的模板化类型?[副本]

vawmfj5a  于 2023-05-20  发布在  其他
关注(0)|答案(2)|浏览(155)

此问题已在此处有答案

How to tell if a type is an instance of a specific template class?(4个答案)
两年前关闭。
在下面的代码中:

template <typename T>
struct templatedStruct
{

};

template <typename T>
void func(T arg)
{
    // How to find out if T is type templatedStruct of any type, ie., templatedStruct<int> or
    // templatedStruct<char> etc?
}

int main()
{
    templatedStruct<int> obj;
    func(obj);
}

是从其他对象继承templatedStruct的唯一方法吗?

struct Base {};

template <typename T>
struct templatedStruct : Base
{

};

template <typename T>
void func(T arg)
{
    std::is_base_of_v< Base, T>;
    std::derived_from<T, Base>; // From C++ 20
}
deyfvvtc

deyfvvtc1#

你可以为它定义一个类型trait。

template <typename T>
struct is_templatedStruct : std::false_type {};
template <typename T>
struct is_templatedStruct<templatedStruct<T>> : std::true_type {};

然后

template <typename T>
void func(T arg)
{
    // is_templatedStruct<T>::value would be true if T is an instantiation of templatedStruct
    // otherwise false
}

LIVE

ocebsuys

ocebsuys2#

你可以写一个重载集,它以不同的方式处理这些情况,并相应地返回一个布尔值:

template <typename T>
constexpr bool check(T const &) { return false; }

template <typename T>
constexpr bool check(templatedStruct<T> const &) { return true; }

然后像这样使用它:

template <typename T>
void func(T arg)
{
    if(check(arg)) // this could be 'if constexpr' if you want only
                   // one branch to be compiled
        // ...
}

相关问题