我来自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) 我目前正在开发一个依赖于递归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_AUTOMAKE中configure.ac.但是,添加该subdir-objects选项似乎打破了构建过程,make抱怨丢失的.Plo文件.我已经在网上搜索了遇到类似问题的人,但没有找到任何合理的提示,如何在不将项目更改为非递归项的情况下解决问题.任何帮助是极大的赞赏.
编辑:
更深入地探讨这个问题,我注意到./configure创建了一个目录,名称$(top_builddir)在库的当前源目录下面,该目录包含.Plo构建库所需的所有文件.在Makefile,但是,我发现.Plo我的库源当量(sourceA.cpp和sourceB.cpp在本例中)由前缀include $(top_builddir)/src/$(DEPDIR)/和$(top_builddir)被定义为一个变量的相对(即,路径../../../src/.deps/).现在很清楚为什么make找不到.Plo文件,因为它搜索错误的目录.这看起来像bug #16375的可能重复.任何解决方法?
编辑2:
在网络上进一步挖掘,揭示了另外两个线程来解决这个问题:#1327和automake-bug.一个已知的解决方法似乎是将--disable-dependency-tracking选项传递给./configure.至少对我来说它有效.
我知道它是不可能超载基本类型(流)运算符如下:
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解决方案.任何提示?
我目前正尝试使用功能模板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)