我的教授说,建议使用PIT而不是RTC来实现基于纪元的循环调度程序.他没有真正提到任何具体原因,我也想不出任何理由.有什么想法吗?
如何编写在任意类型的任意容器上运行的模板函数?例如,我如何推广这个虚函数
template <typename Element>
void print_size(const std::vector<Element> & a)
{
cout << a.size() << endl;
}
Run Code Online (Sandbox Code Playgroud)
至
template <template<typename> class Container, typename Element>
void print_size(const Container<Element> & a)
{
cout << a.size() << endl;
}
Run Code Online (Sandbox Code Playgroud)
这是一个典型的用法
std::vector<std::string> f;
print_size(f)
Run Code Online (Sandbox Code Playgroud)
这给出了错误
tests/t_distances.cpp:110:12: error: no matching function for call to ‘print(std::vector<std::basic_string<char> >&)’. I'm guessing I must tell the compiler something more specific about what types that are allowed.
Run Code Online (Sandbox Code Playgroud)
什么是模板使用的这种变体被调用,我该如何解决?
我正在尝试使用 std::string 作为 std::map 中的键,但是,我无法正确 find() 。我的代码有点复杂和大,所以这是一个演示我遇到的问题的小程序。如果有人能告诉我为什么这不起作用,我将不胜感激。
谢谢。
#include <stdio.h>
#include <string>
#include <map>
struct comparer
{
public:
bool operator()(const std::string x, const std::string y)
{
return x.compare(y)==0;
}
};
int main(int argc, char *argv[])
{
std::map<std::string, int, comparer> numbers;
numbers.insert(std::pair<std::string,int>("One",1));
numbers.insert(std::pair<std::string,int>("Two",2));
numbers.insert(std::pair<std::string,int>("Three",3));
numbers.insert(std::pair<std::string,int>("Four",4));
numbers.insert(std::pair<std::string,int>("Five",5));
std::map<std::string, int, comparer>::iterator it=numbers.find("Three");
if(it!=numbers.end())
printf("The number is %d\n",(*it).second);
else
printf("Error, the number is not found\n");
}
Run Code Online (Sandbox Code Playgroud) 我目前正在开发一个禁止包含C++标准库的项目.我们使用的其中一个编译文件列出了以下符号:
_Xran__Q2_3std12_String_baseCFv
我相信这与标准库字符串有关.我这么想是不正确的?如果没有,是否有人知道一种有效的方法来追踪这个符号的包含点?粗略搜索代码库并没有显示任何明显的东西.
我理解Jam构建现有项目,CMake生成要构建的项目.但是,鉴于我宁愿生成可以在各种IDE中使用的项目,而不是尝试将Jam集成到那些IDE中,有没有人有任何经验/成功将Jamfile转换为CMakeLists.txt文件?
对于这个非变量的例子:
int Func1();
double Func2();
void MyFunc( int, double );
int main()
{
MyFunc( Func1(), Func2() );
//...
}
Run Code Online (Sandbox Code Playgroud)
它没有规定是否Func1()还是Func2()先计算,只是两者都必须做之前MyFunc()被调用.
这个测序如何与可变参数的扩展一起工作?
template < typename Func, typename ...Args >
void MyFunc2( Func &&f, Args&& ...a )
{
int b[] = { f( std::forward<Args>(a) )... };
//...
}
Run Code Online (Sandbox Code Playgroud)
假设这f是一个在第一次调用后改变其状态的函数对象.是否会f为每个段调用a?换句话说,将f在a列表中的第一个项目,然后第二个项目,第三个项目等上调用,而不是随机跳过扩展列表?我们曾经在每个项目之间调用序列点吗?
c++ variadic-functions sequence-points variadic-templates c++11
我有一个抽象的基类,并希望在派生类中实现一个函数.为什么我必须再次在派生类中声明该函数?
class base {
public:
virtual int foo(int) const = 0;
};
class derived : public base {
public:
int foo(int) const; // Why is this required?
};
int derived::foo(int val) const { return 2*val; }
Run Code Online (Sandbox Code Playgroud) 我正在尝试为我编写的程序添加Unicode支持.我的ASCII代码已编译并具有以下行:
std::stringstream stream("abc");
std::istream_iterator<std::string> it(stream);
Run Code Online (Sandbox Code Playgroud)
我将其转换为:
std::wstringstream stream(L"abc");
std::istream_iterator<std::wstring> it(stream);
Run Code Online (Sandbox Code Playgroud)
我在istream_iterator构造函数中收到以下错误:
error C2664: 'void std::vector<_Ty>::push_back(std::basic_string<_Elem,_Traits,_Alloc> &&)' : cannot convert parameter 1 from 'std::basic_string<_Elem,_Traits,_Alloc>' to 'std::basic_string<_Elem,_Traits,_Alloc> &&'
1> with
1> [
1> _Ty=std::wstring,
1> _Elem=wchar_t,
1> _Traits=std::char_traits<wchar_t>,
1> _Alloc=std::allocator<wchar_t>
1> ]
1> and
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Alloc=std::allocator<char>
1> ]
1> and
1> [
1> _Elem=wchar_t,
1> _Traits=std::char_traits<wchar_t>,
1> _Alloc=std::allocator<wchar_t>
1> ]
1> Reason: cannot convert from 'std::basic_string<_Elem,_Traits,_Alloc>' to 'std::basic_string<_Elem,_Traits,_Alloc>'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>, …Run Code Online (Sandbox Code Playgroud) 我们来看一个这个简单的例子:
#include <iostream>
namespace foo {
constexpr int main(int argc, char* argv[]) {
// code
}
}
int main(int argc, char* argv[])
{
return foo::main(argc, argv);
}
Run Code Online (Sandbox Code Playgroud)
取决于代码是什么,clang会抱怨或不抱怨.如果代码是:
cout << "Hello!";
return 0;
Run Code Online (Sandbox Code Playgroud)
clang抱怨:
错误:constexpr函数永远不会产生常量表达式[-Winvalid-constexpr]
Run Code Online (Sandbox Code Playgroud)constexpr int main(int argc, char* argv[]) {注意:非constexpr函数'operator <<>'不能用于常量表达式
Run Code Online (Sandbox Code Playgroud)std::cout << "Hello!";/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/ostream:530:5:注意:在这里声明
Run Code Online (Sandbox Code Playgroud)operator<<(basic_ostream<char, _Traits>& __out, const char* __s)
很公平,constexpr函数不能包含任何cout语句,我们知道.但是如果我们这样做会发生什么?
for (int i = 0; i < argc; i++)
std::cout << argv[i];
Run Code Online (Sandbox Code Playgroud)
clang允许它!好吧,但这不可能是一个constexpr函数,即使它被标记为constexpr,让我们尝试在constexpr上下文中使用它.
int arr[foo::main(argc, argv)];
Run Code Online (Sandbox Code Playgroud)
有用!那一定是clang bug?我之所以说clang是因为gcc抱怨:
错误:constexpr函数的主体'constexpr int foo :: main(int,char**)'不是return语句 …