如何定义嵌套模板



我定义了一个函数如下,它接受一个整数作为模板形参,它像预期的那样工作。

template<int D, typename std::enable_if<std::greater<int>{}(D, 100), void*>::type = nullptr>
void func(int p) {
// something
}
func<100>(1); // ERROR
func<101>(1); // OK

现在,我想把int也作为模板参数。这意味着我需要这样的东西:

template<T D, typename std::enable_if<std::greater<T>{}(D, 100), void*>::type = nullptr>
void func(int p) {
// something
}

嗯,我试过了,但是不能编译。

template<typename T, template<T D, typename std::enable_if<std::greater<T>{}(D, 100), void*>::type = nullptr>>
void func2(int p) {
// something
}

首先需要声明T为类型模板参数。例如

template<typename T, T D, typename std::enable_if<std::greater<T>{}(D, 100), void*>::type = nullptr>
void func(int p) {
// something
}

然后

func<int, 100>(1); // ERROR
func<int, 101>(1); // OK

如果不想明确指定int,可以

template<auto D, typename std::enable_if<std::greater<>{}(D, 100), void*>::type = nullptr>
void func(int p) {
// something
}

然后

func<100>(1); // ERROR
func<101>(1); // OK

如果您可以访问c++ 17,请使用auto非类型模板参数:

template<auto D, typename std::enable_if<std::greater<>{}(D, 100), void*>::type = nullptr>
void func(int p) {
// something
}

最新更新