簡體   English   中英

如何獲取模板class模板參數?

[英]How to get template class template parameter?

我有一個模板 class,想知道當它用作 function 的模板參數時如何獲取模板 class 變量類型。我嘗試執行以下操作

#include <iostream>
#include <type_traits>

using namespace std;

template <typename T>
class foo
{
};

template <typename templateClass>
void f()
{
    if (is_same<typename templateClass::T, int>::value)
        cout << "int";
    else if (is_same<typename templateClass::T, double>::value)
        cout << "double";
    else
        cout << "Unknown type";
}

int main()
{
    f<foo<double>>();

    return 0;
}

此代碼無法編譯,因為no type named 'T' in 'foo<double>' 然后我稍微改變了一下:

#include <iostream>
#include <type_traits>

using namespace std;

template <typename T>
class foo
{
public:
    using Type = T; //can't write : using T = T;
};

template <typename templateClass>
void f()
{
    if (is_same<typename templateClass::Type, int>::value)
        cout << "int";
    else if (is_same<typename templateClass::Type, double>::value)
        cout << "double";
    else
        cout << "Unknown type";
}

int main()
{
    f<foo<double>>();

    return 0;
}

現在它工作正常,但我不得不重命名模板參數。 我可以在不using重命名的情況下獲取模板參數值嗎?

您可以創建特征以在不更改原始類型的情況下提取該信息。

template <typename T>
struct template_parameter;

template <template <typename ...> class C, typename T>
struct template_parameter<C<T>>
{
    using type = T;
};

template <typename T>
using template_parameter_t = typename template_parameter<T>::type;

然后

template <typename templateClass>
void f()
{
    if constexpr (std::is_same_v<template_parameter_t<templateClass>, int>)
        std::cout << "int";
    else if constexpr (std::is_same_v<template_parameter_t<templateClass>, double>)
        std::cout << "double";
    else
        std::cout << "Unknown type";
}

演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM