c++ - 用于初始化模板类的静态数据成员的部分模板特化

标签 c++ templates static-members template-specialization

如何针对特定参数以不同方式初始化模板类的静态数据成员?

我知道模板与其他类型的类不同,只有在项目中使用的才会被实例化。我可以为不同的参数列出许多不同的初始化并让编译器使用合适的那个吗?

例如,以下是否有效,如果无效,正确的方法是什么? :

template<class T>
class someClass
{
   static T someData;
   // other data, functions, etc...
};

template<class T>
T someClass::someData = T.getValue();

template<>
int someClass<int>::someData = 5;

template<>
double someClass<double>::someData = 5.0;

// etc...

最佳答案

应该可以。您可能需要将它们放入 .c 文件而不是 header 中。

int someClass<int>::someData = 5;
double someClass<double>::someData = 5.0;

这也是一个带有静态数据成员初始化的工作部分模板特化:

// .h
template <class T, bool O>
struct Foo {
    T *d_ptr;
    static short id;
    Foo(T *ptr) : d_ptr(ptr) { }
};
template <class T>
struct Foo<T, true> {
    T *d_ptr;
    static short id;
    Foo(T *ptr) : d_ptr(ptr) { }
};
template<class T, bool O>
short Foo<T, O>::id = 0;
template<class T>
short Foo<T, true>::id = 1;

//.cpp
int main(int argc, char *argv[])
{
    Foo<int, true> ft(0);
    Foo<int, false> ff(0);
    cout << ft.id << " " << ff.id << endl;
}

关于c++ - 用于初始化模板类的静态数据成员的部分模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7670374/

相关文章:

c++ - 子类化 fstream 并即时解密数据

c++ - _Complex 和 std::complex 之间的 C/C++ 互操作

c++ - 将模板类的对象作为需要基模板类的函数参数传递

c++ - wchar_t 的模板特化

c# - lock(objlocker) 是否使该对象在应用程序范围内线程安全?静态成员是否自动线程安全?

c++ - 在 C++ 中使用 Pascal 风格的字符串

C++:这种编译时多态性技术如何称呼?有什么优点和缺点?

c++ - 设备代码中 CUDA 类静态成员的成语?

java - 静态变量: How to reclaim memory?

c++ - 运算符== 和 list::remove()