我已經檢查了std::enable_if 以有條件地編譯成員函式
但是它對我不起作用。我需要將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。任何建議和見解都值得贊賞。
我嘗試了concepts@JeJo 的建議,但在執行算術時會出現以下構建錯誤:
error C2676: binary '/': 'T' does not define this operator or
a conversion to a type acceptable to the predefined operator
我在頭檔案中有模板類宣告,在檔案中有實作.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
uj5u.com熱心網友回復:
盡管其他答案所說,成員函式不需要(也不應該)是模板,假設您使用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,但為了簡潔起見,我添加了一個概念。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/486498.html
上一篇:匹配模板模板型別引數
