依赖于模板的实现

Template dependent implementation

本文关键字:实现 依赖于      更新时间:2023-10-16

这是一段简单的代码:

#include <iostream>
#include <fstream>
template<typename T>
class A {
    public:
        T _v;
        template<unsigned short V> void init() { _v *= V; }
        void print(double txt) { std::cout << "Initialized with ?? : " << txt << std::endl; }
};
int main() {
    A<double> foo;
    foo._v = 3.5;
    foo.init<2>();
    foo.print(foo._v);
    A<int> bar;
    bar._v = 2;
    bar.init<5>();
    foo.print(bar._v);
}

我希望函数的实现A::print(double)依赖于unsigned short V,例如,将??替换为init()已从中实例化的unsigned short。我的问题是:(a)它可行吗?(b) 如果(a),如何?

在搜索 if (a) 时,我想我可以在class A<T>中添加一个函子,在 init() 中初始化它的状态(值为 V),在 print(double) 中调用它,但我从未使用过这样的对象,所以我不知道这是否是要走的路。我基本上对任何建议持开放态度,我唯一需要的是对print的调用保持不变(因为我将从其他不知道unsigned short V值的类调用它。

谢谢!

一种方式:

template<typename T>
class A {
    public:
        T _v;
        unsigned short _v2;
        template<unsigned short V> void init() { _v2 = V;  _v *= V; }
        void print(double txt) { std::cout << "Initialized with "
            << _v2 << " : " << txt << std::endl; }
};

或者为什么不:

template<typename T, unsigned short V>
struct A {
        T _v = V;
        void print(double txt) { std::cout << "Initialized with "
            << V << " : " << txt << std::endl; }
};