这是我刚才在野外写的内容的简要说明.我并不是真的希望它可以工作,但确实如此.
#include <array>
template <typename T> using Foo = std::array<T,123>;
const int FOO_SIZE = std::tuple_size<Foo<void>>::value;
Run Code Online (Sandbox Code Playgroud)
我不确定使用voidspecialize Foo会编译,但它确实如此,至少在这种情况下.
我不相信这个解决方案是可移植的,或者它只是一个侥幸,因为实现std::array 恰好与空洞阵列的概念兼容,这对我来说听起来像是无稽之谈.
我什么时候可以,何时可以使用void专门化模板?
如果不复制一半标准(:D),我找不到一套真正令人信服的特定标准措辞,但我相信这是明确定义的。
构造array函数要求它T是MoveConstructible或MoveAssignable,并且您将无法实例化std::array<void, N>.
但这很好,因为std::tuple_size不需要这样做,也没有指定需要这样做,而且这两件事都没有提出任何其他特定要求,从而使您的代码出现问题。
然而,这似乎不是有用的代码,并且对于何时可以用作模板参数没有一般规则。void您必须在使用它的特定上下文中查看您正在使用的特定事物的要求。