【发布时间】:2015-12-11 16:37:14
【问题描述】:
我希望一个类有一个带有模板参数的函数,并根据该模板参数操作特定的成员变量。
例如,如果允许函数模板特化,则如下所示:
struct A
{
struct M1 {};
struct M2 {};
// Function template specialization not allowed :(
template<typename M>
void addM(M const &m);
template<>
void addM(M1 const &m)
{
m1_vec_.push_back(m);
}
template<>
void addM(M2 const &m)
{
m2_vec_.push_back(m);
}
std::vector<M1> m1_vec_;
std::vector<M2> m2_vec_;
};
有什么想法吗?我觉得我错过了一些简单的东西,但又不能完全理解它。
【问题讨论】:
-
为什么不使用
M1和M2的重载函数? -
C++ 让人们很容易错过树木中的木头。 ;-)
-
附带说明,函数模板可以专门化(完全)。这段代码失败的原因是它们不能在类范围内特化。
-
虽然重载是(大部分时间)在这种情况下的方法,但模板看起来更好的解决方案的一种情况是重载使用完全相同的代码,唯一的区别是使用的成员.这对于单行方法来说没什么大不了的,但是将所有代码复制到更复杂的方法中就更麻烦了。
-
@SergeyA 上面的代码在VS2013中编译。我认为代码是有效的,struct 本身不是模板。
标签: c++ function templates specialization