有SAFEARRAY。我需要将它的所有元素放在某种类型的向量中。
你做了什么:
SAFEARRAY * arr;
void * data;
SafeArrayAccessData(this->arr, &this->data);
template<typename T> HRESULT CVarArrayHelper::FillVector(std::vector<T> & vect) const {
VARTYPE type;
OLE_CHECK(SafeArrayGetVartype(this->arr, &type));
switch (type) {
case VT_I1:
CreateVector<int8_t, T>(vect);
break;
case VT_I2:
CreateVector<int16_t, T>(vect);
break;
..............
case VT_UI1:
CreateVector<uint8_t, T>(vect);
break;
..............
case VT_R8:
CreateVector<double, T>(vect);
break;
default:
return E_INVALIDARG;
}
return S_OK;
}
template<typename T, typename R>
void CVarArrayHelper::CreateVector(std::vector<R> & vect) const {
const T * data = static_cast<const T *>(this->data);
if (this->len != 0) {
vect.reserve(vect.size() + this->len);
for (LONG i = 0; i < this->len; i++) {
vect.push_back(static_cast<R>(*data));
data++;
}
}
}
一切都适用于列出的类型。但我仍然需要添加 VT_VARIANT 类型。解决部分模板特化问题的想法
template<typename T, typename R>
R CVarArrayHelper::GetValue(const T & data) const {
return static_cast<R>(data);
}
template<typename R>
R CVarArrayHelper::GetValue<VARIANT>(const VARIANT & data) const {
// Здесь каст варианта к нужному типу
}
template<typename T, typename R>
void CVarArrayHelper::CreateVector(std::vector<R> & vect) const {
const T * data = static_cast<const T *>(this->data);
if (this->len != 0) {
vect.reserve(vect.size() + this->len);
for (LONG i = 0; i < this->len; i++) {
vect.push_back(GetValue<R>(*data));
data++;
}
}
}
但是方法的部分模板特化不起作用。现在有一个想法可以复制CreateVector
VARIANT的方法
template<typename R>
void CVarArrayHelper::CreateVectorVar(std::vector<R> & vect) const {
const VARIANT * data = static_cast<const VARIANT *>(this->data);
if (this->len != 0) {
vect.reserve(vect.size() + this->len);
for (LONG i = 0; i < this->len; i++) {
vect.push_back(GetValueVar<R>(*data));
data++;
}
}
}
嗯,挑战
case VT_VARIANT:
CreateVectorVar<T>(vect);
break;
但我不想重复代码。
你能想到什么吗?
更新
有这样的想法
template<typename T, typename R>
R CVarArrayHelper::GetValue(const T & data) const {
if constexpr (std::is_same_v<T, VARIANT>)
return GetValueVar<R>(data);
else
return static_cast<R>(data);
}
template<typename R>
R CVarArrayHelper::GetValueVar(const VARIANT & data) const {
//
}
但是在线return GetValueVar<R>(data);
我得到编译错误
错误 C2440:“正在初始化”:无法使用 [T=int8_t] 从“const T”转换为“const VARIANT &”
那些。编译器尝试为所有类型编译 GetValueVar 调用。但这似乎不if constexpr
应该发生,不是吗?
问题解决了。这就是它运作良好的方式
只需将标准版本从 14 更改为 17