具有给定类型的C++非类型模板的正确语法

t1rydlwq  于 2023-07-01  发布在  其他
关注(0)|答案(1)|浏览(123)

我有一个类模板化在一个模板类型上的非类型属性指针上,这里是std::optional

#include <optional>

class A
{
public:
  std::optional<int> i;
};

template <typename C, typename T, std::optional<T> C::*optionalPtr>
class OptionalHolder3
{
    void doStuff(C &c);
};

using OH3 = OptionalHolder3<A, int, &A::i>;

它工作得很好,但我很好奇是否可以通过减少所需的模板参数的数量来使它更容易使用,但我找不到正确的语法:

// Doesn't compile
template <typename C, template<class T> std::optional<T> C::*optionalPtr>
class OptionalHolder2
{};

// Doesn't compile
template <template<class C, class T> std::optional<T> C::*optionalPtr>
class OptionalHolder1
{};

using OH2 = OptionalHolder2<A, &A::i>;
using OH2 = OptionalHolder1<&A::i>;

这可能吗?我该如何做?

3okqufwl

3okqufwl1#

你可以使用auto(C++17)来实现:

template <auto>
class OptionalHolder; // No definition

template<typename C, typename T, std::optional<T> C::*optionalPtr>
class OptionalHolder<optionalPtr>
{
    void doStuff(C &c);
};

C++20中的概念可能会被使用,而不是专门化,但是它需要一些trait来提取TC

相关问题