模板参数推导和SFINAE-使用std :: enable_if

约翰尼崩溃

我正在研究过滤传递给重载函数模板的类型的方法。我正在使用Visual Studio 2013。

三部分问题:

  1. 为什么我的编译器无法推断Blorg3
  2. TFoo2(argc)生成编译器错误的原因与#1相同吗?
  3. 有没有办法将模板参数传递给构造函数?

这是示例代码:

#include <type_traits>

#define IFPTR(T,R) typename std::enable_if<std::is_pointer<T>::value, R>::type
#define IFINT(T,R) typename std::enable_if<std::is_integral<T>::value, R>::type

template <class T, IFINT(T, T)* = nullptr> int Blorg1(T n)  { return n + 1; }
template <class T, IFPTR(T, T)* = nullptr> int Blorg1(T n)  { return *n + 1; }
template <class T> IFINT(T, int) Blorg2(T n)                { return n + 1; }
template <class T> IFPTR(T, int) Blorg2(T n)                { return *n + 1; }
template <class T> int Blorg3(IFINT(T, T) n)                { return n + 1; }
template <class T> int Blorg3(IFPTR(T, T) n)                { return *n + 1; }

struct TFoo1 {
    template <class T, IFINT(T, T)* _ = nullptr> TFoo1(T n) { }
};
struct TFoo2 {
    template <class T> TFoo2(IFINT(T, T) n) { }
};

int main(int argc, char* argv[])
{
    Blorg1(argc); // intellisense not happy
    Blorg2(argc);
    Blorg3<int>(argc);  // why cant deduce?
    Blorg1(*argv); // intellisense not happy
    Blorg2(*argv); 
    Blorg3<char*>(*argv); // why cant deduce?
    (void)TFoo1(argc); // intellisense not happy
    (void)TFoo2(argc); // intellisense not happy and !!wont compile!!
    return 0;
}
普雷托里亚人

为什么我的编译器无法推断Blorg3?

std::enable_if<std::is_pointer<T>::value, R>::type::type是指取决于模板参数T的嵌套名称R这是一个非推导的上下文(第1.4.8.2.5 / 5节),因此,编译器不会推导template参数。

这就是为什么TFoo2(argc)生成编译器错误的原因吗?

是的,构造函数模板必须能够推断出其模板参数,而在这种情况下则不能。

是否有语法可向构造函数提供模板参数?

不,正如我已经提到的那样,您不能明确地这样做,必须推导它们,或者模板参数必须具有默认参数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

SFINAE std :: enable_if参数内

SFINAE:std :: enable_if作为函数参数

SFINAE使用std :: enable_if:类型参数与非类型参数

尝试使用SFINAE(std :: enable_if)和模板特化时出现编译错误

使用std :: enable_if和std :: is_arithmetic作为模板参数的问题

用`std :: enable_if`和非推导上下文重载函数模板

`std :: enable_if`通过模板参数的SFINAE自定义类型吗?

基于可变模板存在的std :: enable_if

使用std :: enable_if <>的模板专业化

std :: enable_if如果参数是函数?

在模板函数返回类型上使用std :: enable_if以利用SFINAE-编译错误

用于确定STL容器的模板参数上的std :: enable_if

使用enable_if检查参数包的类型

在constexpr lambda的默认模板参数上使用enable_if

使用不取决于方法的模板参数的enable_if

使用std :: enable_if限制派生类的模板参数时发生编译错误

std :: enable_if和std :: shared_ptr

C ++使用std :: enable_if创建最多10个参数的std :: tuple专业化

std :: enable_if <>的错误

带有std :: enable_if的c ++模板特化

是否可以在可变参数函数模板中使用“ enable_if”和“ is_same”?

C ++ SFINAE-std :: enable_if位置的差异-在模板中还是在返回中

C ++ std :: enable_if约束变量和问题

Enable_if作为模板参数

使用enable_if禁用模板类的模板构造函数

如何根据模板类型使用std :: enable_if启用或禁用构造函数?

我可以使用std :: enable_if摆脱模板专业化吗?

无法使用std :: enable_if在g ++ / clang ++上编译显式专门的模板结构

使用 std::enable_if 重载函数以避免模板替换错误