【发布时间】:2017-12-26 10:38:46
【问题描述】:
假设一些类模板特化有一些公共的公共接口。是否可以只声明一次?
例子:
// Example for a generator
class G
{
public:
double generate(int channel);
};
template <typename Generator>
class A
{
public:
double step();
protected:
Generator g;
};
template <typename Generator, bool fixedMono>
class B;
template <typename Generator>
class B<Generator,true> : public A<Generator>
{
};
template <typename Generator>
class B<Generator,false> : public A<Generator>
{
public:
void setNumChannels(int numChannels);
private:
int numChannels;
};
template<typename Generator>
double B<Generator,true>::step() { return A<Generator>::g.generate(0); }
template<typename Generator>
double B<Generator,false>::step()
{
double sum = 0;
for (int i = 0; i < numChannels; ++i)
sum += A<Generator>::g.generate(i);
return sum;
}
这会失败,因为编译器无法识别在 B 特化中声明的 step(事实上,它不是)。
在一个非玩具示例中,公共接口可能大于单个函数,并且在所有专业化中重复其声明是不可取的。
有没有只指定一次通用接口的好方法?
请注意重构上述示例的建议,因此模板特化不需要有一个公共接口是无关紧要的,除非重构方法是一种总是可以用来消除此类接口的方法。问题是,在需要时只声明一次这样的通用接口在技术上是否可行。
【问题讨论】:
-
您在寻找类型特征吗?
-
在我看来,
func在这两个专业中除了名称之外的任何东西都不常见。只需在每个中声明即可。您已经尝试为每个定义它。 -
@StoryTeller 这很常见。玩具示例实现可能无法很好地反映它。
-
玩具示例仅指定了一个通用名称。如果有共同行为,您可以随时将其提取到其他成员函数中。在
A中定义那些。然后在每个B专业化中的func的每个定义中使用它们。如果这仍然不能满足......好吧,一个更好的例子肯定是为了。 -
@StoryTeller 改进了示例。
标签: c++ templates template-specialization