小编Mar*_*cel的帖子

使用泛型的C#重载决策

我来自C++背景,而且我对C#相对较新.目前,我正在尝试编写两个打印函数,第一个接受通用数组参数(并将数组的项打印到命令行),第二个接受通用基本参数(并调用其ToString()方法).这是我的代码:

using System;

namespace OverloadResolution
{
  class Program
  {
    static void Main(string[] args)
    {
      string[] foo = new string[] { "A", "B", "C" };
      Extensions.PrintMe(foo);
      Extensions.PrintMe("Hello world");
      Console.ReadLine();
    }
  }

  public static class Extensions
  {
    public static void PrintMe<T>(T[] elm)
    {
      Console.WriteLine("PrintMe<T>(T[] elm)");
      Console.WriteLine(string.Join("", elm));
    }

    public static void PrintMe<T>(T elm)
    {
      Console.WriteLine("PrintMe<T>(T elm)");
      Console.WriteLine(elm.ToString());
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作,并选择正确的重载.但是,如果我更改我的代码如下:

using System;

namespace OverloadResolution
{
  class Program
  {
    static void Main(string[] args)
    {
      string[] foo = new string[] { …
Run Code Online (Sandbox Code Playgroud)

c#

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

由于AM_INIT_AUTOMAKE中的subdir-objects选项,Autotools构建失败

我目前正在开发一个依赖于递归automake进行构建的C++项目.我想构建一个共享库,并Makefile.am在库的src目录中看起来像

# ...

# Library name
lib_LTLIBRARIES = libadapter-@MY_API_VERSION@.la

# Sources
libadapter_@MY_API_VERSION@_la_SOURCES = \
    $(top_builddir)/src/sourceA.cpp \
    $(top_builddir)/src/sourceB.cpp

# ...
Run Code Online (Sandbox Code Playgroud)

自1.14版本,automake的问题时,警告subdir-objects未指定的选项AM_INIT_AUTOMAKEconfigure.ac.但是,添加该subdir-objects选项似乎打破了构建过程,make抱怨丢失的.Plo文件.我已经在网上搜索了遇到类似问题的人,但没有找到任何合理的提示,如何在不将项目更改为非递归项的情况下解决问题.任何帮助是极大的赞赏.

编辑: 更深入地探讨这个问题,我注意到./configure创建了一个目录,名称$(top_builddir)在库的当前源目录下面,该目录包含.Plo构建库所需的所有文件.在Makefile,但是,我发现.Plo我的库源当量(sourceA.cppsourceB.cpp在本例中)由前缀include $(top_builddir)/src/$(DEPDIR)/$(top_builddir)被定义为一个变量的相对(即,路径../../../src/.deps/).现在很清楚为什么make找不到.Plo文件,因为它搜索错误的目录.这看起来像bug #16375的可能重复.任何解决方法?

编辑2: 在网络上进一步挖掘,揭示了另外两个线程来解决这个问题:#1327automake-bug.一个已知的解决方法似乎是将--disable-dependency-tracking选项传递给./configure.至少对我来说它有效.

automake autoconf autotools libtool

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

浮点数的全局格式选项

我知道它是可能超载基本类型(流)运算符如下:

std::ostream & operator<<(std::ostream &stream, const double s) {
    stream << std::scientific << std::showpos << std::setprecision(15) << std::to_string(s);
    return stream;
}
Run Code Online (Sandbox Code Playgroud)

为基本类型定义全局格式选项的首选方法是什么?请注意,我想将格式应用于任何类型的输出流,而不仅仅是特定的流std::cout.欢迎使用C++ 11解决方案.任何提示?

c++ c++11

5
推荐指数
2
解决办法
207
查看次数

std :: bind和功能模板

我目前正尝试使用功能模板std::bind创建一个std::function<void()>

template<class Iterator>
void printRange(Iterator first, Iterator last) {
    std::copy(first, last, std::ostream_iterator<typename Iterator::value_type>(std::cout, " "));
    std::cout << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

从概念上讲,我想要的是

int main() {
    std::vector<int> v{1, 2, 3};
    auto f0 = std::bind(printRange, v.begin(), v.end()); // won't compile, of course
    f0();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我知道这不能编译,因此我必须实例化函数模板才能真正使用它。例如,以下替代方法将起作用:

auto f1 = std::bind(printRange<std::vector<int>::const_iterator>, v.begin(), v.end());
auto f2 = std::bind(printRange<decltype(v.begin())>, v.begin(), v.end());
auto f3 = [&v]() { printRange(v.begin(), v.end()); };
Run Code Online (Sandbox Code Playgroud)

我已经创建了一个便利功能

template<class Iterator>
std::function<void()> makePrintRangeFunction(Iterator first, Iterator last) {
    return std::bind(printRange<Iterator>, first, last);
} …
Run Code Online (Sandbox Code Playgroud)

c++ templates stdbind c++11 std-function

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

标签 统计

c++ ×2

c++11 ×2

autoconf ×1

automake ×1

autotools ×1

c# ×1

libtool ×1

std-function ×1

stdbind ×1

templates ×1