C++ 1y/C++ 14:变量模板专业化?

And*_*zos 33 c++ templates c++14

根据C++ 1y/C++ 14 N3690,变量模板特化的类型是否必须与主模板的类型相同?

template<int x>
char y = f(x);

template<>
double y<42> = g();
Run Code Online (Sandbox Code Playgroud)

如果是这样,是否有可能以某种方式保留主要的未定义?

template<int x>
???? y = ???; // undefined

template<>
double y<42> = g();
Run Code Online (Sandbox Code Playgroud)

草案涵盖哪些内容?

类模板的等效功能是:

template<int x>
struct S
{
    static char y;
};

template<>
struct S<42>
{
    static double y;
};
Run Code Online (Sandbox Code Playgroud)

template<int x>
struct S; // undefined

template<>
struct S<42>
{
    static double y;
};
Run Code Online (Sandbox Code Playgroud)

Ric*_*ith 23

变量模板特化的类型是否必须与主模板的类型相同?

不,变量模板的显式(或部分)特化可以指定与隐式实例化隐含的类型不同的类型.在实现Clang的功能时,我们发现规范没有规则要求在这种情况下匹配类型,我们将问题带到C++核心工作组,在那里确认这个遗漏是故意的.

是否有可能以某种方式保留主要的未定义?

如果没有在类型中指定,则无法声明主变量模板 - 没有允许这样的事情的语法.

草案涵盖哪些内容?

这些都被遗漏所涵盖- 没有规则要求类型匹配,并且没有语法来声明没有类型的变量模板.所以我不能指出你在标准的任何特定部分,并说"这里的规则不是".

如果您可以访问C++标准委员会的反射器,请参阅以core-23901开头的主题以供讨论.

  • 谢谢理查德.我想我们可以提出`template <typename T> void x;`作为声明一个不可实例化的模板变量primary的方法.也许没有核心变化就有更好的方法. (2认同)

Die*_*ühl 1

我完全希望专业化的声明需要与主模板完全匹配,包括其类型。这对于变量模板来说并不是什么新鲜事。我还没有追查标准中的细节,看看它在哪里指定了这个细节。

下面的代码似乎做了类似于您想要的事情,即保持变量类型处于打开状态:

#include <iostream>

template <int X> struct var_type { typedef int type; };
template <> struct var_type<42> { typedef double type; };

int    f(int x) { return x; }
double g()    { return 3.14; }

template <int X>
typename var_type<X>::type var = f(X);
template <>
typename var_type<42>::type var<42> = g();

int main()
{
    std::cout << "var<17>=" << var<17> << '\n';
    std::cout << "var<42>=" << var<42> << '\n';
}
Run Code Online (Sandbox Code Playgroud)