j4x*_*j4x 7 c++ templates pointers
我开始道歉,如果我是愚蠢的,如果它是如此明显,找不到答案.
我已经看过几十页讨论指针参数的特定模板专业化.
但是,我希望能够防止模板专门化指针参数,但我无法弄清楚如何做到这一点.
template< class T >
void function( T arg )
{
//...
}
int main( )
{
int i = 42;
function( i ); // Ok
function( &i ); // Die bastart with a compiler error!
}
Run Code Online (Sandbox Code Playgroud)
可能吗?
谢谢.
Arm*_*yan 14
你可以声明专门化(在这种情况下,它在技术上只是一个重载),但没有定义它:)
template<typename T >
void function( T arg )
{
//...
}
template<typename T >
void function( T* arg ); //no definition
int main()
{
int i = 42;
function( i ); // Ok
function( &i ); //ERROR
}
Run Code Online (Sandbox Code Playgroud)
小智 7
在C++ 11中,您可以使用static_assert以下方式:
template<class T>
void func(T arg) {
static_assert(!std::is_pointer<T>::value,
"The argument to func must not be a pointer.");
// Do something after the static_assert.
// Now you are sure that T isn't a pointer.
}
Run Code Online (Sandbox Code Playgroud)
可以在Ideone上找到一个例子.
我推荐这个,因为当有人试图用指针调用你的函数时,它会给出更有用的错误消息(链接器错误在这种情况下可能非常混乱).此外,链接错误在链接发生之前不会显示.
我自己就是一个模板元编程新秀,但我想
template<typename T>
void function(typename std::enable_if<!std::is_pointer<T>::value,T>::type arg)
{
//...
}
Run Code Online (Sandbox Code Playgroud)
应该工作,因为这个函数应该只存在非指针参数.当然,这需要C++ 11或至少TR1或boost的类型特征设施.