小编Wil*_*ode的帖子

使用 Lambda 进行模板类型推导

我面临的问题很简单。给出以下代码:

template <typename ReturnType, typename... Args>
auto CallIt( ReturnType( *method )( Args... ) )
{
    return method;
}

auto test = CallIt( [] ( int a, int b )
{
    return a > b;
} );
Run Code Online (Sandbox Code Playgroud)

我得到的错误(使用 VS13 和 2013 年 11 月的 CTP 编译器)是:

无法从 main::<lambda_e795bf5a030334e5fc8f3c26dbe00e0e> 推断出 ReturnType (__cdecl *)(Args...) 的模板参数

据我了解,lambda 不是函数指针,但未捕获的 lambda 可以分配给匹配签名的函数指针。如果您显式指定模板参数,则此方法有效。我希望看到一种无需显式指定模板参数即可实现此功能的方法。预先感谢您的帮助。

正如 Marco A. 提供的答案的评论中所指出的,可能有一个解决方案,使用 lambda 类上的一元 + 运算符,有效地将其转换为函数指针。但是,在请求的 IDE/编译器组合中,我收到以下警告转变为错误:

从“lambda []bool (int a, int b)->bool”到内置类型的不止一个转换函数适用:

函数“lambda []bool (int a, int b)->bool::operator bool (*)(int a, …

c++ lambda templates type-deduction

5
推荐指数
1
解决办法
3308
查看次数

自定义集合中的每个C++

因此,自从它被引入以来,我一直喜欢使用for each关键词进行迭代STL collections.(我非常喜欢语法糖).

我的问题是如何编写可以使用这些关键字迭代的自定义集合?

从本质上讲,我需要为我的集合公开哪些APi才能使用这些关键字进行迭代?

如果这听起来很生硬,我很抱歉,但请不要回答"使用提升","不要写自己的收藏品"等.我的朋友,追求知识.如果不可能,嘿,我可以处理.

我也非常希望不必将STL迭代器注入我的集合中.

提前致谢!

c++ collections foreach loops

3
推荐指数
2
解决办法
3032
查看次数

为什么这个模板类没有编译?

所以我有以下代码:

template <typename Type>
class Delegate
{
public:
    Delegate(Type x)
    {
    }
};

void Method()
{
}

int main()
{
    Delegate d(&Method);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:为什么编译器不能根据传递给构造函数的内容推断出模板类型?我得到的编译错误是:Argument list for class template Delegate is missing.我理解,但我认为类型推断可以克服这一点,以允许更清晰的语法.

c++ templates constructor variadic-templates

3
推荐指数
1
解决办法
56
查看次数

将参数传递给ASP .NET页面

所以我最近开始使用ASP .NET,但我对其他.NET框架非常熟悉.我正在处理的应用程序需要将字符串索引作为命令行样式参数.现在在我的Page类中,我有一个const字符串,我用它作为占位符.所以我的问题是两个人:

1-如何设置应用程序innerts以接收打开页面时传入的参数?

2-如何将该参数传递给页面(特别是在我使用VS 2010时)?

非常感谢!

.net asp.net arguments

2
推荐指数
1
解决办法
8600
查看次数

宏生成可疑错误

我一直在用C++编写一个内存管理器,并且一直使用宏代替传统的调用new.这背后的动力是双重的:我需要捕获有关所请求分配的类型信息,并且我想生成干净的语法.对于宏来说,这是一项艰巨的任务.但这是我提出的:

#define anew( TYPE ) new ( Allocator::Instance( )->Allocate<TYPE>( ) ) TYPE
Run Code Online (Sandbox Code Playgroud)

它调用分配器在内存池中为类型的对象TYPE(相对于宏)创建一个点.然后它使用返回的指针Allocate作为放置参数new,允许构造函数在这个新分配的内存上运行.到目前为止有道理.所以在正常使用中,这是它扩展的方式:

Obj* a = anew( Obj )( );
Obj* a = new ( Allocator::Instance( )->Allocate<Obj>( ) ) Obj( );
Run Code Online (Sandbox Code Playgroud)

这很棒!但是当我尝试将它与具有多个参数的模板化类一起使用时,它会爆炸(我的意思是它会产生错误).

Obj<int, bool>* a = anew( Obj<int, bool> )( );
Run Code Online (Sandbox Code Playgroud)

这抱怨没有足够的类型参数提供给模板参数.经过一些戳之后,我明白这是因为模板参数中的逗号.既然如此,我该如何解决这个问题呢?

更好的是,还有更好的方法吗?我认为将它作为宏是有意义的,因为我真的只想在这里进行一些直接文本替换.但是,从以不同的方式解决这个问题,我能获得什么吗 是否可以在不使用宏的情况下完成此操作?我尝试过这条路线,出现的问题是调用构造函数.以下代码无效,但它会很好:

Obj* a = anew<Obj>( );
Run Code Online (Sandbox Code Playgroud)

其中括号只能对应给定类型的有效构造函数.

任何帮助将不胜感激.谢谢!

[编辑]

尽管Variadic Macros也解决了我的问题,但我在下面选择的答案是我认为是我问题的最佳C++解决方案.谢谢大家这么快解决这个问题.

c++ macros templates

2
推荐指数
1
解决办法
51
查看次数

找不到任何已安装的 .NET Core SDK

我正在尝试构建一个 Docker 映像并为我的示例 ASP.NET Core 3.1 应用程序运行一个容器,我看到

找不到任何已安装的 .NET Core SDK

当我运行命令时

docker run --rm -it -p 8000:80 ppi

我的 Dockerfile 很简单:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
COPY publish/ ./
ENTRYPOINT ["dotnet", "sampleapp.dll"]
Run Code Online (Sandbox Code Playgroud)

我正在将我的应用程序预构建到publish文件夹中。我的文件夹结构如下:

root/
  source/
    SampleApp.csproj
    appsettings.json
    Startup.cs
    Program.cs
  publish/
    SampleApp.dll
    SampleApp.exe
    appsettings.json
    SampleApp.deps.json
    SampleApp.runtimeconfig.json
    web.config
  Dockerfile
  SampleApp.sln
Run Code Online (Sandbox Code Playgroud)

我使用以下命令创建了图像

docker build -t ppi

我的示例应用程序没有问题,因为我可以使用以下命令在本地启动它

dotnet publish/sampleapp.dll

我在这里缺少什么?我一直在学习以下教程:

  1. 构建 .NET Docker 镜像
  2. dotnet-docket/samples/aspnetapp

c# docker .net-core asp.net-core

1
推荐指数
1
解决办法
9162
查看次数