如果我有:
template< typename T >
foo( T bar )
{
// do stuff.
}
如果有人写
,如何禁用模板int bar;
foo(bar)?
让我再解释一下:
template< typename T, typename Y > inline void
destroy( T &t, Y &y )
{
}
template< typename T, typename Y > inline void
destroy( T &t, Y &&y )
{
}
template< typename T > inline void
destroy( T &t, unsigned long int &y )
{
}
如果我输入
destroy< unsigned long int >( something, 10 )
它叫
template< typename T, typename Y > inline void
destroy( T &t, Y &&y )
答案 0 :(得分:5)
模板参数可以从函数参数推导出来,因此无需明确指定。
你可以通过扣减失败来避免这种情况:
template<typename T>
struct wrap { typedef T type; };
template<typename T>
void foo(typename wrap<T>::type bar);
void test()
{
foo(3); // fails
foo<int>(3); // works
}
答案 1 :(得分:0)
您不能停止自动模板扣除,只能停止下雨。
您可以做的是为做希望模板实例化的类型提供专业化,而不是为非专业版提供实现。
template< typename T >
foo( T bar );
template<> foo <int> (int bar)
{
// do stuff.
}
这将为foo
类型或可转换为int
的类型提供int
专门化 。