c++ - C++ 部分模板特化的问题

标签 c++ templates template-specialization partial-specialization

我有类似的情况:

template<class A, class B>
class MyClass<A, B>
{
  ...
  static A RARELY_USED_A;
}

// Seems to work but does not cover all possible cases, since 
// there may be instances of A that have no numeric limits.
template<class A, class B>
A MyClass<A, B>::RARELY_USED_A= std::numeric_limits<A>::max();

据我所见,这似乎可行。但是,在某些情况下,字符串可能会用作 A,因此我认为我应该为这种特殊情况创建一个专门化。

// Does not complile
template<class B>
string MyClass<string, B>::RARELY_USED_A= "";

不幸的是,这不能正确地符合错误信息:

error: template definition of non-template 'std::string MyClass<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, B>::RARELY_USED_A'

请注意,另一方面,完全特化似乎可行(在运行时未经测试但可以编译)

// This complies but is not gernic enough and hence useless to me
template<>
string MyClass<string, string>::RARELY_USED_A= "";

我想,我一定做错了什么。如果您能指出它到底是什么,我将不胜感激。我认为部分特化应该以这种方式工作。

非常感谢。

e:将 DEFAULT_A 的名称编辑为 RARELY_USED_A,因为我认为“默认”在某种程度上具有误导性

最佳答案

使用继承来重用和专门化,而无需复制所有通用代码:

template<typename A>
struct RarelyUsedShared
{
    static A RARELY_USED_A;
};

template<typename A>
A RarelyUsedShared<A>::RARELY_USED_A = std::numeric_limits<A>::max();

template<>
string RarelyUsedShared<string>::RARELY_USED_A = "";

template<typename A, typename B>
class MyClass<A, B> : RarelyUsedShared<A>
{
  ...
};

请注意,这将导致在各种 B 之间共享成员,如果成员应为 const,则可以。如果没有,助手可以采用两个模板参数,您可以对其进行部分特化:

template<typename A, typename B>
struct RarelyUsedNotShared
{
    static A RARELY_USED_A;
};

template<typename A, typename B>
A RarelyUsedNotShared<A, B>::RARELY_USED_A = std::numeric_limits<A>::max();

template<typename B>
struct RarelyUsedNotShared<string, B>
{
    static A RARELY_USED_A;
};

typename<typename B>
string RarelyUsedNotShared<string, B>::RARELY_USED_A = "";

template<typename A, typename B>
class MyClass<A, B> : RarelyUsedNotShared<A, B>
{
  ...
};

关于c++ - C++ 部分模板特化的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6696939/

相关文章:

c++ - 访问元组 vector 中的元素 C++

c++ - 添加大数字 C++ - 初始化程序失败

c++ - C++代码的规则引擎

c++ - 预编译 header 的问题?

C++ 简单模板递归

c++ - 如果模板参数不允许实例化某个类,如何编写模板重载函数并触发回退

c++ - 如何访问/修改 OpenCV 中的矩阵元素?为什么 at() 被模板化?

azure - Arm 模板将不会部署。提示缺少 NSG 资源,但它已包含在模板中

c++ - 如何有条件地将函数添加到类模板?

C++模板显式声明成员函数值/避免宏问题