我尝试在gcc 6.0中使用新的c ++ 1z功能实际开发.
如果我尝试这个小例子:
#include <iostream>
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;
int main()
{
fs::path p1 = "/home/pete/checkit";
std::cout << "p1 = " << p1 << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
我有:
/opt/linux-gnu_6-20151011/bin/g++ --std=c++1z main.cpp -O2 -g -o go /tmp/ccaGzqFO.o: In function \`std::experimental::filesystem::v1::__cxx11::path::path(char const (&) [36])': /opt/linux-gnu_6-20151011/include/c++/6.0.0/experimental/bits/fs_path.h:167: undefined reference to `std::experimental::filesystem::v1::__cxx11::path::_M_split_cmpts()' collect2: error: ld returned 1 exit status
gcc版本是快照linux-gnu_6-20151011
任何提示如何链接新的c ++ 1z功能?
如果我想使用std::any我可以使用RTTI关闭.以下示例-fno-rtti使用gcc 编译并按预期运行.
int main()
{
std::any x;
x=9.9;
std::cout << std::any_cast<double>(x) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
但是如何std::any存储类型信息?正如我所看到的,如果我std::any_cast使用"错误"类型调用,我会得到std::bad_any_cast预期的异常.
这是如何实现的,或者这可能只是一个gcc功能?
我发现boost::any也不需要RTTI,但我发现也没有解决这个问题.boost :: any需要RTTI吗?.
深入研究STL标题本身并没有给我答案.那段代码对我来说几乎是不可读的.
我正在寻找类似的东西:
template< typename T>
void func(T t)
{
}
template< typename... Parms>
void anyFunc( Parms... p)
{
func<Parms>(p)... ; //error
func(p)... ; //error
}
Run Code Online (Sandbox Code Playgroud)
如果参数包扩展在另一个函数调用内完成,它可以工作:
template< typename T>
int some(T t)
{}
template< typename... Parms>
void func(Parms ...p)
{}
template< typename... Parms>
void somemore(Parms... p)
{
func( some(p)...);
}
int main()
{
somemore(1,2,3,4,10,8,7, "Hallo");
}
Run Code Online (Sandbox Code Playgroud)
参数包扩展也适用于基类初始值设定项列表.
是否有任何解决方案也适用于将返回'void'的函数.上面的解决方法不会,虽然使用函数调用返回参数列表中的void可能永远不会工作.
有任何想法吗?
使用vim和c ++ 11 lambda函数实际上很差.缩进不起作用,许多括号被标记为错误.
据我所知,c和c ++的缩进和语法高亮是在内部编程而不是通过ac [...].vim文件.有没有机会为c ++ 11设置vim,特别是对于具有lambda函数的源代码?也许有人可以提示在内部vim语法检查中如何以及在何处添加lambda解析?
编辑:(评论请求的示例代码)
代码应如下所示,但格式化为单个列.
MyLoop( [](int a, int b){
{
::i++;
for (;;)
{
SomeFunc();
}
cout << "Result: " << a*b<<endl;
}
});
Run Code Online (Sandbox Code Playgroud)
更新vim 7.4:现在vim不再处理lambda表达式作为错误,但它仍然没有在lambda表达式中做任何缩进,所以它仍然不能用于c ++ :-(
顺便说一句:有没有一个好的自动格式化工具可以添加到vim环境,所以在外部按一个键进行格式化?
我开始将jenkins中的一些工作迁移到管道执行.
有没有机会在多分支管道作业中看到警告图?在我的旧项目中,我可以使用"配置趋势图"选项配置图形.这些选项将在管道语法工具中崩溃.
有没有选项让图表可见?
我有我的Jenkinsfile:
stage ('Warnings gcc') {
step([$class: 'WarningsPublisher', canComputeNew: false, canResolveRelativePaths: false, defaultEncoding: '', excludePattern: '', healthy: '', includePattern: '', messagesPattern: '', parserConfigurations: [[parserName: 'GNU Make + GNU C Compiler (gcc)', pattern: 'error_and_warnings.txt']], unHealthy: ''])
}
stage ('Warnings clang') {
step([$class: 'WarningsPublisher', canComputeNew: false, canResolveRelativePaths: false, defaultEncoding: '', excludePattern: '', healthy: '', includePattern: '', messagesPattern: '', parserConfigurations: [[parserName: 'Clang (LLVM based)', pattern: 'error_and_warnings_clang.txt']], unHealthy: ''])
}
Run Code Online (Sandbox Code Playgroud)
将生成报告但不显示图表.
更新:现在它仍然无法工作,但也不可能使用剪切生成器作为警告插件.
在snipped生成器中为警告插件输入文件名会导致java null指针异常:
javax.servlet.ServletException: java.lang.NullPointerException …Run Code Online (Sandbox Code Playgroud) 考虑下面的代码,我不明白为什么必须定义print的空函数.
#include <iostream>
using namespace std;
void print()
{
}
template <typename T, typename... Types>
void print (const T& firstArg, const Types&... args)
{
cout << firstArg << endl; // print first argument
print(args...); // call print() for remaining arguments
}
int main()
{
int i=1;
int j=2;
char c = 'T';
print(i,"hello",j,i,c,"word");
}
Run Code Online (Sandbox Code Playgroud) 我想问一下以下代码是否有效.
我想知道在一个表达式中多次扩展参数包的可能性.
#include <iostream>
#include <tuple>
class ExpandWithConstructor
{
public:
template <typename ... T>
ExpandWithConstructor( T... args) { }
};
template <typename T>
int PrintArgs( T arg )
{
std::cout << arg << ", ";
return 0;
}
template <typename Head, typename ... T>
class DebugPrinter: public DebugPrinter<T...>
{
public:
DebugPrinter() { }
template< typename ...Y>
DebugPrinter( Y ... rest )
{
std::cout << "Construction of: " << __PRETTY_FUNCTION__ << " Values: " ;
ExpandWithConstructor{PrintArgs( rest)...};
std::cout << std::endl;
} …Run Code Online (Sandbox Code Playgroud) 在下标运算符中使用lambda似乎不适用于g ++和clang.
这是c ++标准中的实现错误还是"不快乐"规则?
例:
class A
{
public:
template<typename T> void operator[](T) {}
template<typename T> void operator()(T) {}
};
int main()
{
A a;
a[ [](){} ]; // did not compiler: see error message
a( [](){} ); // works as expected
}
Run Code Online (Sandbox Code Playgroud)
错误:
main.cpp:13:6: error: two consecutive '[' shall only introduce an attribute before '[' token
a[ [](){} ];
^
main.cpp:13:15: error: expected primary-expression before ']' token
a[ [](){} ];
Run Code Online (Sandbox Code Playgroud)
我知道属性以"[["开头,但我想知道"[["(带有一个或多个空格)也像:
void func( int x [ [gnu::unused] ] ) …Run Code Online (Sandbox Code Playgroud) 这个版本工作正常:
template<typename T>
struct Foo
{
template<typename U = T>
typename std::enable_if<std::is_same<U,A>::value>::type
bar() { std::cout << "1" << std::endl; }
template<typename U = T>
typename std::enable_if<std::is_same<U,B>::value>::type
bar() { std::cout << "2" << std::endl; }
};
Run Code Online (Sandbox Code Playgroud)
此版本失败:
template<typename T>
struct Foo2
{
template<typename U = T, typename V = typename std::enable_if<std::is_same<U,A>::value>::type >
V bar() { std::cout << "1" << std::endl; }
template<typename U = T, typename V = typename std::enable_if<std::is_same<U,B>::value>::type >
V bar() { std::cout << "2" << std::endl; }
}; …Run Code Online (Sandbox Code Playgroud) 我的基本想法是从std :: tuple派生我自己的类,以获得一些内部帮助器类型:
template <typename ... T>
class TypeContainer: public std::tuple<T...>
{
public:
using BaseType = std::tuple<T...>;
static const size_t Size = sizeof...(T);
TypeContainer(T... args):std::tuple<T...>(args...){};
using index_sequence = std::index_sequence_for<T...>;
};
Run Code Online (Sandbox Code Playgroud)
现在我尝试使用如下代码:
using MyType_tuple_with_empty = std::tuple< std::tuple<float,int>, std::tuple<>, std::tuple<int>>;
using MyType_typecontainer_with_empty = TypeContainer< TypeContainer<float,int>, TypeContainer<>, TypeContainer<int>>;
using MyType_tuple_non_empty = std::tuple< std::tuple<float,int>, std::tuple<int>, std::tuple<int>>;
using MyType_typecontainer_non_empty = TypeContainer< TypeContainer<float,int>, TypeContainer<int>, TypeContainer<int>>;
template <typename T>
void Do( const T& parms )
{
// The following lines result in errors if TypeContainer with
// …Run Code Online (Sandbox Code Playgroud)