我有一个模板类,如下所示:
template <class T, int N>
class kernel: public std::array<T, N << 1> {
:
public:
kernel(void) : std::array<T, N << 1>{} { blah... }
template <typename... E>
kernel(const E &&... e):
std::array<T, N << 1>{{std::forward<const E>(e)...}} { blah... }
:
T write_wav(const char *filename) const { blah... }
};
在我的程序中,我为T和N的各种值实例化kernel<T, N>
没有问题,但实际上从不调用kernel<T, N>::write_wav()
,因此编译器不会为它生成定义。
事情是,我希望编译器生成一个定义,因为我想从调试器中调用kernel<T, N>::write_wav()
(VC ++ 2015中的立即窗口)。我如何强制编译器这样做?
到目前为止,我偶然发现的唯一工作方法是从构造函数中调用kernel<T, N>::write_wav()
,从而生成对它的引用:
kernel(void) : std::array<T, N << 1>{} { write_wav(nullptr); }
template <typename... E>
kernel(const E &&... e):
std::array<T, N << 1>{{std::forward<const E>(e)...}} { write_wav(nullptr); }
唉,这引入了不必要的执行开销。有更清洁的方法吗?
如果我尝试使用kernel :: write_wav()的地址,就像这样:
kernel(void) : std::array<T, N << 1>{} { &kernel<T, N>::write_wav; }
然后事情编译正常但成员函数仍然没有实例化(可能是因为编译器可以发现它的地址没有用处)。
或者,我尝试在类中创建指向成员的指针并为其分配地址:
T(kernel<T, N>::*write_wav_ptr)(const char *filename) const;
kernel(void) : std::array<T, N << 1>{} { write_wav_ptr = &kernel<T, N>::write_wav; }
然后事情正常(并且kernel :: write_wav()得到实例化),但内核的每个实例现在都有一个我不需要的额外数据成员。