gpt4 book ai didi

c++ - 可变参数模板 : Perfect forwarding of integer parameter to lambda

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:18:01 27 4
gpt4 key购买 nike

有类似的问题,但我没有找到适合我的问题的答案。

考虑以下代码:

#include <cassert>
#include <functional>
#include <iostream>
#include <memory>
#include <utility>

class TestClass
{
public:
TestClass( int value): mValue( value) { }
private:
int mValue;
};

template< typename T> class DeferredCreator
{
public:
template< class... Args> DeferredCreator( Args&&... args):
mpCreator( [=]() -> T*
{ return new T( std::forward< Args>( args)...); }
),
mpObject()
{ }

T* get() {
if (mpObject == nullptr)
mpObject.reset( mpCreator());
return mpObject.get();
}
private:
std::function< T*( void)> mpCreator;
std::unique_ptr< T> mpObject;
};


int main() {
DeferredCreator< int> dcInt( 42);

assert( dcInt.get() != nullptr);
return 0;
}

想法是 DeferredCreator 类仅在真正需要时才创建对象。我得到了这份工作,例如对于字符串,但我不知道如何将一个简单的整数传递到我的 lambda 中。

我得到的错误信息是:

prog.cpp:19:26: error: no matching function for call to 'forward'
{ return new T( std::forward< Args>( args)...); }
^~~~~~~~~~~~~~~~~~~
prog.cpp:36:27: note: in instantiation of function template specialization 'DeferredCreator<int>::DeferredCreator<int>' requested here
DeferredCreator< int> dcInt( 42);
^
/usr/bin/../lib/gcc/x86_64-linux-gnu/6.3.0/../../../../include/c++/6.3.0/bits/move.h:76:5: note: candidate function not viable: 1st argument ('const int') would lose const qualifier
forward(typename std::remove_reference<_Tp>::type& __t) noexcept
^
/usr/bin/../lib/gcc/x86_64-linux-gnu/6.3.0/../../../../include/c++/6.3.0/bits/move.h:87:5: note: candidate function not viable: 1st argument ('const int') would lose const qualifier
forward(typename std::remove_reference<_Tp>::type&& __t) noexcept
^
2 errors generated.

我已经尝试使用 decltype( args)作为 std::forward<> 的模板参数,但这没有帮助。

代码也可以在这里找到:https://ideone.com/MIhMkt

最佳答案

args... 是常量,因为 lambda 的调用运算符隐式为 const。所以,如果你让你的 lambda 可变,那么它就可以工作了:

[=]() mutable -> T*
{ return new T( std::forward< Args>( args)...); }

它不能与 decltype(args) 一起工作的原因是类型本身不是 const,只是调用运算符。

关于c++ - 可变参数模板 : Perfect forwarding of integer parameter to lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52182420/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com