在 constexpr lambda 的默认模板参数上使用 enable_if
Using enable_if on a defaulted template argument for a constexpr lambda
我正在尝试编写一个将始终 return 一个 -1
的通用函数。我希望模板参数列表默认为 int
。我正在尝试使用 std::enable_if
或 std::enable_if_t
通过使用 std::is_arithmetic
或 std::is_arithmetic_v
来测试类型 T
是否是有效的算术类型。我遇到了语法问题,无法正确编译。这是我的 lambda 的样子:
template<typename T = int,
std::enable_if_t<std::is_arithmetic_v<T>> >
static constexpr T negative_one = [](){
return static_cast<T>(-1);
};
这是一个非常琐碎的函数和概念,但编译器想要抱怨默认参数不在参数列表的末尾......它的正确定义是什么样的?
这就是我的使用方式:
{
int i = negative_one();
float f = negative_one<float>();
}
为 sfinae 使用非类型可选模板参数。如果您想将 it/pass 作为谓词调用,您的类型必须是 lambda 类型(而不是 T
)。您可以通过自动类型推导来实现这一点。
template<typename T = int, std::enable_if_t<std::is_arithmetic_v<T>, int> = 0>
static constexpr auto negative_one = [](){
return static_cast<T>(-1);
};
另一种选择是使用函数而不是 lambda:
template<typename T = int, std::enable_if_t<std::is_arithmetic_v<T>, int> = 0>
static constexpr T negative_one() {
return static_cast<T>(-1);
};
我正在尝试编写一个将始终 return 一个 -1
的通用函数。我希望模板参数列表默认为 int
。我正在尝试使用 std::enable_if
或 std::enable_if_t
通过使用 std::is_arithmetic
或 std::is_arithmetic_v
来测试类型 T
是否是有效的算术类型。我遇到了语法问题,无法正确编译。这是我的 lambda 的样子:
template<typename T = int,
std::enable_if_t<std::is_arithmetic_v<T>> >
static constexpr T negative_one = [](){
return static_cast<T>(-1);
};
这是一个非常琐碎的函数和概念,但编译器想要抱怨默认参数不在参数列表的末尾......它的正确定义是什么样的?
这就是我的使用方式:
{
int i = negative_one();
float f = negative_one<float>();
}
为 sfinae 使用非类型可选模板参数。如果您想将 it/pass 作为谓词调用,您的类型必须是 lambda 类型(而不是 T
)。您可以通过自动类型推导来实现这一点。
template<typename T = int, std::enable_if_t<std::is_arithmetic_v<T>, int> = 0>
static constexpr auto negative_one = [](){
return static_cast<T>(-1);
};
另一种选择是使用函数而不是 lambda:
template<typename T = int, std::enable_if_t<std::is_arithmetic_v<T>, int> = 0>
static constexpr T negative_one() {
return static_cast<T>(-1);
};