c++模板专门化思考
Thinking in C++ template specialization
环境:Microsoft Visual Studio 2010
编码标准:c++ 0x compatible
我有一个类模板
template <typename T1, int I>
class A
{
public template <typename T2> void f(T2 x);
/*...*/
};
template <typename T1, int I>
template <typename T2>
void A<T1, I>::f(T2 x)
{
/*...*/
}
和以上类
的部分专门化template <int I>
class A<char, I>
{
public template <typename T2> void f(T2 x);
/*...*/
};
那么我可以像下面这样在部分专门化类中专门化成员函数吗?
template <int I>
template <>
void A<char, I>::f<double>(double x)
{
}
谢谢!
NB:我没有在研究它,但在想它是否适用。如果你知道这个规则的话,很容易评分。
这是无效的,因为如果不向任何封闭的类模板提供固定的模板参数,就不能显式特化成员函数。
不兼容c++ 11,但正在MSVC上工作
Microsoft编译器有一个扩展,允许在类模板中声明显式特化。尽管我从未尝试过,但很有可能它会接受以下非标准代码
template <int I>
class A<char, I>
{
public:
template <typename T2> void f(T2 x);
template<> void f<double>(double x) {
}
/*...*/
};
更新:Clang编译并报告
// clang++ -fms-extensions main1.cpp
main1.cpp:10:21: warning: explicit specialization of 'f' within class scope is a
Microsoft extension [-Wmicrosoft]
template<> void f<double>(double x) {
^
c++ 11/c++ 03兼容
这里的方法是重载而不是专门化
template <int I>
class A<char, I>
{
public:
template <typename T2> void f(T2 x);
void f(double x) {
}
/*...*/
};
相关文章:
- 是否可以对零模板参数进行模板专门化
- 尝试根据类中 typedef 的存在来专门化模板函数
- 如何基于模板化类的基类专门化成员函数
- 如何为指向复杂值的迭代器专门化算法?
- 专门化模板覆盖函数/避免对象切片
- 我能否根据其运算符()的签名专门化可变参数模板参数
- 如何使用模板化类专门化模板化函数?
- 线程 std::调用未知类型,无法专门化函数错误
- 输入两个不专门化大小的矩阵
- 如何在模板类中专门化赋值运算符?
- 如何专门化容器和枚举的模板
- Clang拒绝类模板的嵌套类仅通过专门化定义的代码是正确的吗
- 取消专门化C++模板参数
- SFINAE的变分变量模板专门化
- 如何在编译时专门化大型模板函数中的小部分
- 如何在c++运算符()中专门化调用模板
- 模板函数,其中一个参数需要专门化,而另一个不需要
- 如何专门化字符串数组的模板?
- 如何专门化模板
- 如何避免为模板化迭代器的每个可能的实例化专门化iterator_traits?