在C ++ 17中,是否有一种方法可以在模板中实现类似于前向声明的功能? 我想要实现的是这样的:
foo
很显然,这里template<typename T, SizeType D, typename SizeType = int>
取决于D
,因此它必须先于它。但是在那种情况下,除非SizeType
也有一个默认参数(我不想要),否则我无法设置默认参数。基本上,我希望能够在D之前“声明” D
,但在D之后可以“定义”。
编辑:这是我想如何使用它的一个示例:
SizeType
答案 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;
}