如何使类模板的成员函数的参数依赖于类模板参数值?

How to make a class template's member function's argument dependent on the class template parameter value?

提问人:S.V 提问时间:11/17/2023 最后编辑:cigienS.V 更新时间:11/17/2023 访问量:84

问:

如何根据类模板参数值选择类模板成员函数的参数类型?

下面是一个示例:

#include <memory>
template <class T, bool plainPointer=true>
class C
{
    // pseudocode below
    void f(plainPointer ? T * x : std::shared_ptr<T> x) { /*implementation*/ }
};  

也就是说,如果 ,应定义以下类成员函数:plainPointer==true

void f(T * x) { /*implementation*/ }

否则,应定义此成员函数:

void f(std::shared_ptr<T> x) { /*implementation*/ }

我希望这两个函数都有一个实现,并且只有参数类型应该是依赖的。fplainPointer

C++ 模板 参数 编译时

评论


答:

8赞 cigien 11/17/2023 #1

您可以使用 std::conditional_t 在 2 种类型之间进行选择:

void f(std::conditional_t<plainPointer, T*, std::shared_ptr<T>> x) {
   /*implementation*/ 
}

请注意,要使此方法起作用,对于所有实例化,必须正确格式化 中的两个选项。conditional_t


如果计划在类中多次使用该函数参数类型,则可以创建可重用的类型别名:

using ptr_type = std::conditional_t<plainPointer, T*, std::shared_ptr<T>>;