gpt4 book ai didi

c++ - 如何提供用于创建静态和动态大小 vector 的通用接口(interface)?

转载 作者:搜寻专家 更新时间:2023-10-31 01:33:10 24 4
gpt4 key购买 nike

我目前有很多代码都适用于动态大小 vector (例如 std::vectorEigen::VectorXd ……),我希望它也适用于 静态大小 vector (例如 std::array , Eigen::Vector3d , ...)。我的代码针对 TVector 进行了模板化以这样一种方式,它假设 TVector刚刚 sizeoperator[] .但最大的问题是 build

在构建静态和动态 vector 方面没有共同点。我决定替换所有对 TVector 的构造函数的调用。通过以下假设函数:

template <typename TVector>
TVector createVector(std::size_t sizeAtInitialization)
{
if (TVector has constructor taking an integral type)
return TVector(sizeAtInitialization);
else
return TVector(); // sizeAtInitialization ignored
}

这样一个通用调用 createVector<TVector>将变为 createVector<std::vector<double>>(3)createVector<std::array<double, 3>>(3) .

std::is_default_constructible在这里对我没有帮助,因为这两种 vector 类型都是默认可构造的。

但是,我不确定这样的事情是否可能。

我研究过static if here成员函数检测 here .这一切似乎都非常复杂,因为 static_if使用必须返回中间结果的 lambda,必须已经构建,我不确定它会导致任何地方。

最佳答案

您可以使用 std::is_constructible连同一些 sfinae 和 std::enable_if

using namespace std;

template <class T>
using IntegerConstructible =
typename enable_if<is_constructible<T, int>::value, T>::type;

template <class T>
using NotIntegerConstructible =
typename enable_if<!is_constructible<T, int>::value, T>::type;

template<class T>
auto createVector(int size)
-> IntegerConstructible<T> {
return {size};
}

template<class T>
auto createVector(int size)
-> NotIntegerConstructible<T>{
return {};
}

int main(){
auto x = createVector<std::vector<int>>(3);
auto y = createVector<std::array<int,3>>(3);
return 0;
}

IntegerConstructibleNotIntegerConstructible是别名模板,只要可以(或不能)构造模板参数就可以定义它们。定义时 IntegerConstructible<T> = T .

所以只有两个createVector之一函数有一个有效的返回类型,另一个不能被调用。这允许编译器选择正确的重载。

关于c++ - 如何提供用于创建静态和动态大小 vector 的通用接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41879095/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com