如何将泛型 class 方法模板参数限制为某些类型?
How to restrict generic class method template parameter to certain types?
我已经查看了std::enable_if to conditionally compile a member function
但是它对我不起作用。我需要将 class 方法的 T
限制为某些类型。
template<typename T = typename enable_if_t<
is_same_v<T, long> || is_same_v<T, int> || is_same_v<T, double>
|| is_same_v<T, float> || is_same_v<T, size_t>>
>
shared_ptr<Node<T>> LinkedList<T>::AddNumbers(
shared_ptr<Node<T>> p1, shared_ptr<Node<T>> p2, T carry)
{
<snip>
}
我收到构建错误:
identifier T is undefined
我正在使用 C++20。感谢任何建议和见解。
我尝试了@JeJo 建议的 concepts
,但在执行算术的行上出现以下构建错误:
error C2676: binary '/': 'T' does not define this operator or
a conversion to a type acceptable to the predefined operator
我在头文件中有模板 class 声明,在 .cpp
文件中有实现。头文件:
template <typename T> class LinkedList
{
public:
<snip>
shared_ptr<Node<T>> AddNumbers(
shared_ptr<Node<T>>, shared_ptr<Node<T>>, T carry = 0);
};
当我使用@JeJo 的建议时,我碰到了
error C3855: 'LinkedList<T>': template parameter 'T' is
incompatible with the declaration
尽管其他答案怎么说,假设您使用 requires
,成员函数不需要(也不应该)是模板。只有在使用经典 SFINAE 时才需要这样做。
#include <cstddef>
#include <iostream>
#include <memory>
#include <type_traits>
template <typename T, typename ...P>
concept one_of = (std::is_same_v<T, P> || ...);
template <typename T>
struct Node {};
template <typename T>
class LinkedList
{
public:
std::shared_ptr<Node<T>> AddNumbers(std::shared_ptr<Node<T>>, std::shared_ptr<Node<T>>, T carry = 0)
requires one_of<T, int, long, std::size_t, float, double>
{
// ...
}
};
int main()
{
LinkedList<int> s;
s.AddNumbers(nullptr, nullptr, 0);
LinkedList<char> t;
// t.AddNumbers(nullptr, nullptr, 0);
}
任何布尔条件都可以拼写在 requires
之后,但为了简洁起见,我添加了一个概念。
我已经查看了std::enable_if to conditionally compile a member function
但是它对我不起作用。我需要将 class 方法的 T
限制为某些类型。
template<typename T = typename enable_if_t<
is_same_v<T, long> || is_same_v<T, int> || is_same_v<T, double>
|| is_same_v<T, float> || is_same_v<T, size_t>>
>
shared_ptr<Node<T>> LinkedList<T>::AddNumbers(
shared_ptr<Node<T>> p1, shared_ptr<Node<T>> p2, T carry)
{
<snip>
}
我收到构建错误:
identifier T is undefined
我正在使用 C++20。感谢任何建议和见解。
我尝试了@JeJo 建议的 concepts
,但在执行算术的行上出现以下构建错误:
error C2676: binary '/': 'T' does not define this operator or
a conversion to a type acceptable to the predefined operator
我在头文件中有模板 class 声明,在 .cpp
文件中有实现。头文件:
template <typename T> class LinkedList
{
public:
<snip>
shared_ptr<Node<T>> AddNumbers(
shared_ptr<Node<T>>, shared_ptr<Node<T>>, T carry = 0);
};
当我使用@JeJo 的建议时,我碰到了
error C3855: 'LinkedList<T>': template parameter 'T' is
incompatible with the declaration
尽管其他答案怎么说,假设您使用 requires
,成员函数不需要(也不应该)是模板。只有在使用经典 SFINAE 时才需要这样做。
#include <cstddef>
#include <iostream>
#include <memory>
#include <type_traits>
template <typename T, typename ...P>
concept one_of = (std::is_same_v<T, P> || ...);
template <typename T>
struct Node {};
template <typename T>
class LinkedList
{
public:
std::shared_ptr<Node<T>> AddNumbers(std::shared_ptr<Node<T>>, std::shared_ptr<Node<T>>, T carry = 0)
requires one_of<T, int, long, std::size_t, float, double>
{
// ...
}
};
int main()
{
LinkedList<int> s;
s.AddNumbers(nullptr, nullptr, 0);
LinkedList<char> t;
// t.AddNumbers(nullptr, nullptr, 0);
}
任何布尔条件都可以拼写在 requires
之后,但为了简洁起见,我添加了一个概念。