基于模板的链表 - 在搜索操作中应该返回什么?

Template based Linked List - What should be Returned in search operation?

我正在使用模板并定义了以下模板化的 ListNode。

template <typename T>
class ListNode{
    private :
    public:
        ListNode *left;
        ListNode *right;
        T data;
        ListNode(T data){ this->data = data; }
};

如果我使用以下原型在此链表上实现搜索操作,函数的 return 值应该是什么。如果 T 是一个指针,我可以 return NULL,但是如果 T 是一个 Complete 对象,那么 return 类型应该是什么,我如何区分 T 是一个指针还是一个 Complete 对象。此搜索功能如何适用于 T,其中 T 可以是指针或完整对象。

T List_search(T srch_data);

    T List_search(T srch_data) {

        ListNode<T> *curr = head;
         while (curr) {
            if (comp_fn.compare_data (curr->data, srch_data) == 0)
                return curr->data;
            curr = curr->right;
        }
        return NULL;                   <<< Compilation error if T is complete object 
    }

一个选项是让事情简单化:return 找到的项目的地址,nullptr 如果找不到该项目:

   template <typename T>
   T* List_search(T srch_data) 
   {
        ListNode<T> *curr = head;
         while (curr) 
         {
            if (comp_fn.compare_data (curr->data, srch_data) == 0)
                return &curr->data;
            curr = curr->right;
         }
         return nullptr;
   }

然后客户端将检查 nullptr,如果不是 nullptr,则可以取消引用指针。

比如链表节点持有一个int类型:

int* foundData = List_search(10)
if ( foundData )
{
    std::cout << *foundData;
}