我试图在非模板化的类中专门化模板化方法,其中方法的返回类型包括模板化类型 - 此方法不带参数。我一直在寻找并尝试通过反复试验来编译,但无济于事。
如何构建此代码?这种语法甚至可能吗? (我试图专门化的模板化方法是cBar::getFoos
,如下面的评论所示。)
下面的简化示例代码:
#include <vector>
////////////////////////////////////////////////////////////////////////////////
// the non-templated class below contains std::vector objects of these types
// (tBuiltInType is an int, float, or bool - but hopefully that's not an
// assumption that needs to be made, as I'd like to include more complex types)
template< typename tBuiltInType >
class cFoo
{
public:
// ...
void doSomething()
{
// ... (unimportant what happens here, but stuff happens)
}
private:
std::vector< tBuiltInType > m_objects;
};
////////////////////////////////////////////////////////////////////////////////
// this contains the templated method I'm trying to specialize - getFoos
class cBar
{
public:
// ...
// this is the method I'm trying to specialize by contained type (see private area)
// getFoos< int >() would return m_intFoos, etc.
template< typename tBuiltInType >
std::vector< cFoo< tBuiltInType > > &getFoos();
// (probably unimportant) example use
template< typename tBuiltInType >
void doSomething()
{
for ( cFoo< tBuiltInType > &foo : getFoos< tBuiltInType >() )
foo.doSomething();
}
private:
std::vector< cFoo< int > > m_intFoos;
std::vector< cFoo< bool > > m_boolFoos;
std::vector< cFoo< float > > m_floatFoos;
};
////////////////////////////////////////////////////////////////////////////////
// some (also probably unimportant) example usage code
int main()
{
cBar bar;
bar.doSomething< int >();
bar.doSomething< bool >();
bar.doSomething< float >();
return 0;
}
(我正在拜访我的家人并且没有笔记本电脑,所以我通常的开发设置是不可用的 - 我可以发布在线编译器尝试的错误,但我一直在尝试,但我怀疑它在这里做得很好,因为没有多少人会看到一个神秘的在线编译错误,并且知道该怎么做,所以为了压缩问题文本,我会跳过这一点。)< / p>
答案 0 :(得分:2)
在课堂上继续专攻,
template<>
std::vector< cFoo< int > >& cBar::getFoos() { return m_intFoos; }
答案 1 :(得分:1)
您希望getFoos<int>()
返回m_intFoos
等?我认为最简单的方法是引入一个空的tag-dispatch类型:
template <typename T> struct empty { };
template< typename tBuiltInType >
std::vector< cFoo< tBuiltInType > >& getFoos()
{
return getFoosImpl(empty<tBuiltInType>{} );
}
然后提供正确的重载:
std::vector< cFoo<int> >& getFoosImpl(empty<int> ) { return m_intFoos; }
std::vector< cFoo<bool> >& getFoosImpl(empty<bool> ) { return m_boolFoos; }
std::vector< cFoo<float> >& getFoosImpl(empty<float> ) { return m_floatFoos; }