Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C+的启发性用法+;11 decltype 我刚看到摇滚乐:C++由Boris Jabes进化。在关于高阶泛型编程的演讲中,他说下面是一个函数的示例,该函数的返回类型更为泛型,并导致更少的模板函数重载 template <typename Func> auto deduce(const Func & f) -> decltype(f()) {..} 模板 自动推断(const Func&f)->decltype(f()) {..}_C++_Templates_C++11_Decltype - Fatal编程技术网

C+的启发性用法+;11 decltype 我刚看到摇滚乐:C++由Boris Jabes进化。在关于高阶泛型编程的演讲中,他说下面是一个函数的示例,该函数的返回类型更为泛型,并导致更少的模板函数重载 template <typename Func> auto deduce(const Func & f) -> decltype(f()) {..} 模板 自动推断(const Func&f)->decltype(f()) {..}

C+的启发性用法+;11 decltype 我刚看到摇滚乐:C++由Boris Jabes进化。在关于高阶泛型编程的演讲中,他说下面是一个函数的示例,该函数的返回类型更为泛型,并导致更少的模板函数重载 template <typename Func> auto deduce(const Func & f) -> decltype(f()) {..} 模板 自动推断(const Func&f)->decltype(f()) {..},c++,templates,c++11,decltype,C++,Templates,C++11,Decltype,但是,这可以通过使用普通模板语法实现,如下所示 template <typename Func> Func deduce(const Func & f) {..} 模板 Func推断(常数Func&f) {..} 所以我猜所选的例子并没有真正显示出decltype的独特功能。有人能举一个例子说明decltype的这种更具启发性的用法吗 std::for_each(c.begin(), c.end(), [](decltype (c.front()) val){val*=2

但是,这可以通过使用普通模板语法实现,如下所示

template <typename Func>
Func deduce(const Func & f)
{..}
模板
Func推断(常数Func&f)
{..}
所以我猜所选的例子并没有真正显示出
decltype
的独特功能。有人能举一个例子说明
decltype
的这种更具启发性的用法吗

std::for_each(c.begin(), c.end(), [](decltype (c.front()) val){val*=2;});

如果没有decltype,则无法自动扣除容器c的值类型。

您的怀疑是错误的

void f() { }
现在
推断(&f)
的类型为
无效
,但重写后,它的类型为
无效(*)(
)。在任何情况下,只要您想获得表达式或声明的类型,都可以使用
decltype
(请注意这两者之间的细微差别。
decltype(x)
不一定与
decltype((x))

例如,您的标准库实现可能包含以下行

using size_t = decltype(sizeof(0));
using ptrdiff_t = decltype((int*)0 - (int*)0);
using nullptr_t = decltype(nullptr);
<>找到正确的返回类型<代码>添加< /C> >在过去的C++中一直是一个具有挑战性的问题。这现在是一个简单的练习

template<typename A, typename B> 
auto add(A const& a, B const& b) -> decltype(a + b) { return a + b; }

我使用它的一个地方是,我需要创建一个变量,该变量必须具有与另一个变量相同的类型。但我不确定将来这种类型是否会保持不变

void foo(int a)//maybe in future type of a changed
{
    decltype(a) b;
    //do something with b
}

否。第一个示例意味着
推断(f)
返回
函数的结果类型。第二个示例意味着
推断(f)
返回
Func
。你看到区别了吗?啊,对不起,我错过了
decltype
的参数中额外的
()
。我的错误。只有在使用lambdas的情况下才能做到这一点,因为它们不是多态的(但希望它们是在C++y中)。如果您使用的是多态函数对象,它将自动推导。请您解释一下:
(0)。~decltype(0)()?恐怕我不明白。(0)。~decltype(0)(;不使用gcc编译,但使用clang编译。如果0被一个类对象替换,它将是一个显式调用对象自己的析构函数,这很有用。所以这是允许的(至少通过叮当声),这样模板就可以处理类对象和int等
void foo(int a)//maybe in future type of a changed
{
    decltype(a) b;
    //do something with b
}