为嵌套模板编写C ++ 17样式“ _v”帮助模板的正确方法

问题描述 投票:0回答:1

标准库提供了用于在编译时确定不同类型特征的模板。例如:

[std::is_integral<T>::value会告诉您某物是否为整数类型。

自C ++ 17起,为这些类型特征模板添加了快捷方式“帮助程序模板”。

[std::is_integral_v<T>提供相同的结果,而无需::value


类似于std::is_integral,我有一个相对复杂的模板来确定一种类型是否是另一种类型的特化:

template <typename T, template <typename...> typename Template>
struct is_specialization : std::false_type {};

template <template <typename...> typename Template, typename... Args>
struct is_specialization<Template<Args...>, Template> : std::true_type {};

下面显示一个用法示例(如果传入的类型是std::complex的特殊化,它将启用此模板功能:

#include <complex>
#include <iostream>
#include <type_traits>

template <typename T>
struct MyComplex
{
    MyComplex(const T& real, const T& imag)
        : real(real)
        , imag(imag)
    {}

    T real() { return this->real; }

    T imag() { return this->imag; }

private:
    T real;
    T imag;
};

// Only enable this template if "T" is a specialization of "std::complex"
template <typename T,
    typename = std::enable_if_t<is_specialization<T, std::complex>::value>
>
void foo(T value)
{
    std::cout << value.real() << std::endl;
}

int main()
{
    std::complex<double> value1{ 1.0, 2.0 };
    foo(value1);

    std::complex<int> value2{ 1, 2 };
    foo(value2);

    MyComplex<double> value3{ 1.0, 2.0 };

    // Fails to compile because "MyComplex<double>" is not a specialization of "std::complex"
    //foo(value3);
}

我想为此编写一个“ _v”帮助程序模板,但是由于它涉及嵌套模板,因此我不确定如何。

由于is_specialization具有两个模板参数,所以我的第一个念头就是要做这样的事情,也许编译器会发现“ T”和“ U”可以是自己的嵌套类型,但似乎没有工作:

template <typename T, typename U>
inline constexpr bool is_specialization_v = is_specialization<T, U>::value;

为类似的东西编写“ _v”帮助模板的正确方法是什么?也请尝试解释它在答案中的工作方式,因为我对模板元编程还相当陌生,但我仍在努力解决一些概念。

c++ c++17 template-meta-programming template-specialization typetraits
1个回答
0
投票

您的别名参数错误,应该与主模板相同:

© www.soinside.com 2019 - 2024. All rights reserved.