我有一个带有类型和非类型模板参数的模板类。我想特化一个成员函数,我发现,如下例所示,我可以进行完全特化。
template<typename T, int R>
struct foo
{
foo(const T& v) :
value_(v)
{}
void bar()
{
std::cout << "Generic" << std::endl;
for (int i = 0; i < R; ++i)
std::cout << value_ << std::endl;
}
T value_;
};
template<>
void foo<float, 3>::bar()
{
std::cout << "Float" << std::endl;
for (int i = 0; i < 3; ++i)
std::cout << value_ << std::endl;
}
但是这个部分特化不会编译。
template<int R>
void foo<double, R>::bar()
{
std::cout << "Double" << std::endl;
for (int i = 0; i < R; ++i)
std::cout << value_ << std::endl;
}
有没有人知道可以实现我正在尝试的方法?我在 MSVC 2010 中试过这个。
最佳答案
您可以将函数包装在一个类中。
只有类,而不是函数,可以部分特化。
template<typename T, int R>
struct foo
{
foo(const T& v) :
value_(v)
{}
void bar()
{
return bar_impl< T, R >::bar( * this );
}
friend struct bar_impl< T, R >;
T value_;
};
template< typename T, int R >
struct bar_impl {
static void bar( foo< T, R > &t ) {
std::cout << "Generic" << std::endl;
for (int i = 0; i < R; ++i)
std::cout << t.value_ << std::endl;
}
};
template<>
struct bar_impl<float, 3> {
static void bar( foo< float, 3 > &t ) {
std::cout << "Float" << std::endl;
for (int i = 0; i < 3; ++i)
std::cout << t.value_ << std::endl;
}
};
template<int R>
struct bar_impl<double, R> {
static void bar( foo< double, R > &t ) {
std::cout << "Double" << std::endl;
for (int i = 0; i < R; ++i)
std::cout << t.value_ << std::endl;
}
};
关于c++ - 具有非类型参数的成员函数的部分特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5688355/