gpt4 book ai didi

c++ - 根据维度启用一个 operator()

转载 作者:搜寻专家 更新时间:2023-10-31 00:29:03 25 4
gpt4 key购买 nike

我想创建一个 form 类,该类基于其模板参数,为一个 operator() 提供一个或多个参数。这是曲线的原型(prototype),例如线性、双线性等。

因此,如果表单维数是 n,运算符应该有 n 整数参数,所以 formdim == 1 的线性表单应该有 operator()(i)formdim == 2 我想要 operator()(i, j)

我认为 enable_if 可能会有任何帮助,但我对 TMP 并不是很了解,而且我有一个编译错误:

template<unsigned int formdim>
class form
{
public:
form()
{}

auto operator()(unsigned int j) -> typename std::enable_if<formdim == 1, unsigned int>::type
{
std::cout << "LINEAR" << std::endl;
return 0;
}

// Here I get a compiler error due to the missing type
auto operator()(unsigned int i, unsigned int j) -> typename std::enable_if<formdim == 2, double>::type
{
std::cout << "BILINEAR" << std::endl;
}
};

如何提供这样的类(class)?我不需要自动的参数数量,我可以根据需要手动添加新的运算符……但显然这确实非常酷。

感谢您的帮助!

最佳答案

在 C++17 中你可以使用 if constexpr (即静态 if 子句)并将其作为:

template<unsigned int formdim>
class form {
public:
template<typename... Args>
decltype(auto) operator()(Args&&... args) {
if constexpr (formdim == 1) {
static_assert(sizeof...(args) == 1);
std::cout << "LINEAR" << std::endl;
return 0;
} else if constexpr (formdim == 2) {
static_assert(sizeof...(args) == 2);
std::cout << "BILINEAR" << std::endl;
return 0.0;
} else {
static_assert(sizeof...(args) < 3);
return 0;
}
}
};

Live Demo

关于c++ - 根据维度启用一个 operator(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43001761/

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