JeD*_*JeD 1 c++ templates pointers
所以我有这个模板功能.它应该在一个更复杂的结构中设置一个变量AbstractEvent:
template< typename T >
void AbstractEvent::setVar( QString varName, T value)
{
if (std::is_pointer<T>::value)
{
void * castValue = static_cast<void*>(value);
if (castValue)
{
//do sth with castValue
}
}
else
{
//do something with value
}
}
Run Code Online (Sandbox Code Playgroud)
使用此模板函数,我想将变量"value"存储在QVariant中,然后将QVariant存储在某处.
如果"value"是指针,我想将它作为void*存储在QVariant中.对于其他任何我想存储真实类型的东西.
我尝试使用C++ trait std :: is_pointer :: value来检查value是否为指针.
这段代码编译得很好,但是当我尝试使用它时,例如:
int intValue = 0;
setVar<int>("aVar",intValue);
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
error C2440: 'static_cast' : unable to convert from 'int' to 'void *'
Run Code Online (Sandbox Code Playgroud)
我认为编译器很困惑,因为它正在检查这一行:
void * castValue = static_cast<void*>(value);
Run Code Online (Sandbox Code Playgroud)
当值不是指针时,这当然没有意义.这就是我的if语句
if (std::is_pointer<T>::value)
Run Code Online (Sandbox Code Playgroud)
应该避免,但是,即使在运行时,这段代码的值作为int将永远不会被执行,在编译时它会混淆编译器......是否有解决这类问题的方法?
标签发送:
template< typename T >
void AbstractEvent::setVar_impl( QString varName, T value, std::true_type /*is_ptr*/)
{
void * castValue = static_cast<void*>(value);
if (castValue)
{
//do sth with castValue
}
}
template< typename T >
void AbstractEvent::setVar_impl( QString varName, T value, std::false_type /*is_ptr*/)
{
//do something with value
}
template< typename T >
void AbstractEvent::setVar( QString varName, T value){
setVar_impl(varName, value, std::is_pointer<T>());
}
Run Code Online (Sandbox Code Playgroud)
或者,过载然后SFINAE不适用:
template<typename T>
typename std::enable_if<std::is_pointer<T>::value>::type
AbstractEvent::setVar(QString varName, T value)
{
void * castValue = static_cast<void*>(value);
if (castValue)
{
//do sth with castValue
}
}
template< typename T>
typename std::enable_if<!std::is_pointer<T>::value>::type
AbstractEvent::setVar( QString varName, T value)
{
//do something with value
}
Run Code Online (Sandbox Code Playgroud)
第三种选择,直接过载:
template< typename T >
void AbstractEvent::setVar( QString varName, T* value)
{
void * castValue = static_cast<void*>(value);
if (castValue)
{
//do sth with castValue
}
}
template< typename T >
void AbstractEvent::setVar( QString varName, T value)
{
//do something with value
}
Run Code Online (Sandbox Code Playgroud)
第一个模板比第二个模板通过部分排序更专业,因此如果两个模板同样可行则将被选择.
您可能还想要特殊T == nullptr_t情况.nullptr_t不是指针类型,但您可能希望在该情况下调用指针重载.
简单的重载,有人吗?
template<typename T>
void AbstractEvent::setVar(QString varName, T value);
template<typename T>
void AbstractEvent::setVar(QString varName, T* value);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
216 次 |
| 最近记录: |