避免在头文件中定义模板

3

我在头文件 A.h 中定义了以下类:

class A {

private:

template<int i>
void method();

};

有没有办法让我将method的实现保留在A.cpp文件中,像通常的方法一样? 我问这个问题是因为将实现放在A.h中会使接口非常难以阅读,特别是因为它是一个私有函数。

如果只使用有限的“i”值来实例化它,那么这是否有影响呢?


1
如果您提前知道将要使用的“i”的所有值,则可以为每个想要允许的“i”值显式实例化它。 - Jerry Coffin
从一般意义上讲,针对.cpp文件的特定用途,不行。但是有严格的限制,可以参考:https://dev59.com/bHVD5IYBdhLWcg3wBWzd - aruisdante
如果您只是因为可读性而无法将实现放在头文件中,您可以将实现放在单独的文件中,然后在头文件底部包含该文件。 - user1937198
那个重复的地址似乎是您实际需要的,将实现与接口定义分离开来。 - aruisdante
你可以将模板声明为对指定的“i”外部实例化,并在某个cpp文件中显式实例化它。请参见http://stackoverflow.com/questions/22768865/can-i-use-fno-implicit-templates-feature-only-for-one-template的答案。 - Frax
1
如果您只在A类的其他非模板成员内使用模板方法,则只需要将该模板的定义放在A.cpp文件中,因为该定义需要可见的仅是该cpp文件。 - Mikael Persson
1个回答

5
你可以按照广泛使用的惯例,执行以下操作:
A.hpp
class A {

private:

template<int i>
void method();

};

#include "A.tcc"

A.tcc


template<int i>
void A::method() {
    // do something with i
}

请注意,实现文件的命名应与.cpp扩展名不同,这样可以避免大多数标准构建系统环境混淆(除非您完全手动选择翻译单元文件)。


如果您想针对某些i值提供专门的实现,可以按以下方式提供:

// Specialization for 1
template<>
void A::method<1>() {
    // do something for specialization with 1
}

template<>
void A::method<2>() {
    // do something for specialization with 2
}

我喜欢*.tcc扩展名。我要把所有的*_impl.h都改成*.tcc。 - Nick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接