如果未提供模板参数,如何禁用模板?

时间:2013-12-13 18:25:48

标签: c++

如果我有:

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 )

2 个答案:

答案 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专门化