我有以下仿函数包装另一个仿函数或lambda函数并自动设置索引参数.一个例子将解释得最好.我可以做以下事情:
auto f = stx::with_index([](int a, int index){ std::cout << a << " " << index << std::endl; });
f(5);
f(3);
f(9);
Run Code Online (Sandbox Code Playgroud)
输出:
5 0
3 1
9 2
Run Code Online (Sandbox Code Playgroud)
这是仿函数代码:
template<class FUNC>
class IndexFunctor
{
public:
typedef FUNC FUNC_T;
explicit IndexFunctor(const FUNC_T& func) : func(func), index(0) {}
template<class... ARGS>
void operator ()(ARGS&&... args)
{
func(args..., index++);
}
const FUNC_T& GetFunctor() const
{
return func;
}
int GetIndex() const
{
return index;
}
void SetIndex(int index)
{
this->index = index;
} …Run Code Online (Sandbox Code Playgroud) 我无法实现自己的模板类,我想添加自己的emplace_back函数实现.由于我还在学习模板设计,所以我很感激您的意见.
template <typename T, typename ...Args>
class MydataStruct
{
public:
//...
void emplace_back(Args&&... args)
{
//...
myqueue.emplace_back(args...);
}
//...
private:
std::deque<T> myqueue;
};
Run Code Online (Sandbox Code Playgroud)
样品用途:
MydataStruct<int> test;
test.emplace_back(1);
Run Code Online (Sandbox Code Playgroud)
每当我尝试编译此代码时,我都会收到未定义emplace_back的错误.它只适用于没有参数.我该怎么解决这个问题?
我从这个答案中看到了这段代码的片段,我似乎无法理解模板和类型名的排列如何创建main()中显示的最终函数调用.
特别是,可变参数模板模板的安排和std :: forward的使用让我很困惑.
任何人都可以打破这段代码,以便我能更好地理解它吗?
#include <utility>
template <template <typename...> class TemplateClass, typename... Args>
TemplateClass<Args...> make(Args&&... args)
{
return TemplateClass<Args...>(std::forward<Args>(args)...);
}
int main()
{
make<std::pair>(1, 2);
}
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激.
我遇到了下面用C++编写的这个函数.trace()使用任意数量的参数调用函数会打印每个参数的值以及格式中参数的名称
name1:value1 | name2:value2等等.
我想了解这段代码是如何工作的,什么有的像双&符号的语法&&,__VA_ARGS__意思.谢谢!
#define tr(...) trace(#__VA_ARGS__, __VA_ARGS__)
template <typename Arg1>
void trace(const char* name, Arg1&& arg1){
cout << name << " : " << arg1 << endl;
}
template <typename Arg1, typename... Args>
void trace(const char* names, Arg1&& arg1, Args&&... args){
const char* comma = strchr(names + 1, ',');
cout.write(names, comma-names) << " : " << arg1 << " | " ;
trace(comma+1, args...);
}
Run Code Online (Sandbox Code Playgroud)