非类型模板参数取决于默认模板类型参数

时间:2019-07-04 08:51:36

标签: c++ templates c++17

在C ++ 17中,是否有一种方法可以在模板中实现类似于前向声明的功能? 我想要实现的是这样的:

foo

很显然,这里template<typename T, SizeType D, typename SizeType = int> 取决于D,因此它必须先于它。但是在那种情况下,除非SizeType也有一个默认参数(我不想要),否则我无法设置默认参数。基本上,我希望能够在D之前“声明” D,但在D之后可以“定义”。

编辑:这是我想如何使用它的一个示例:

SizeType

2 个答案:

答案 0 :(得分:2)

可以做类似的事情

template<typename T, auto DArg, typename SizeType = int, SizeType D = DArg>

现在首先提供D的参数,然后提供D的类型,最后将参数转换为正确类型的D

答案 1 :(得分:0)

我考虑了StoryTeller的回答和评论,提出了其他建议:

template<typename T, auto D>

面向未来读者的最小解决方案示例:

#include <iostream>
template<typename T, auto D>
class StaticArray
{
public:
    using size_type = decltype(D);
};

int main()
{
    StaticArray<float, 5ul> s;
    std::cout << typeid(decltype(s)::size_type).name() << "\n";
    return 0;
}

这也是说明“强制转换”及其含义的示例:

 #include <iostream>
template<typename T, auto D, typename SizeType = decltype(D)>
class StaticArray
{
public:
    using size_type = SizeType;
    static const size_type convertedDim = static_cast<size_type>(D);
    static const decltype(D) Dim = D;
};

int main()
{
    StaticArray<float, 1ull<<40, int> s;
    std::cout << typeid(decltype(s.Dim)).name() << "\n";
    std::cout << s.Dim << "\n";
    std::cout << typeid(decltype(s.convertedDim)).name() << "\n";
    std::cout << s.convertedDim << "\n";
    return 0;
}