我有一个类,在这个类中,有一个函数,它将同一个类的另一个实例作为参数.在这个函数里面我需要做一些事情,但是只有传递的参数与当前的参数不同.以下代码是否正确执行此操作?
class Foo
{
void Foo::func(Foo &other)
{
if (this != &other)
// do stuff
}
}
Run Code Online (Sandbox Code Playgroud) 我正在编写一个带有分拣机功能对象的分类库.其中一个主要类别sorter_facade旨在operator()根据已存在的重载为分拣机提供一些重载.这是一个简单的heap_sorter对象简化示例,实现了一个heapsort:
struct heap_sorter:
sorter_facade<heap_sorter>
{
using sorter_facade<heap_sorter>::operator();
template<typename Iterator>
auto operator()(Iterator first, Iterator last) const
-> void
{
std::make_heap(first, last);
std::sort_heap(first, last);
}
};
Run Code Online (Sandbox Code Playgroud)
最简单的目标之一sorter_facade是在operator()已经存在一对迭代器的重载时为分类器提供可迭代的重载.这是一个简化的实现sorter_facade,足以解决手头的问题:
template<typename Sorter>
struct sorter_facade
{
template<typename Iterable>
auto operator()(Iterable& iterable) const
-> std::enable_if_t<
not has_sort<Sorter, Iterable>,
decltype(std::declval<Sorter&>()(std::begin(iterable), std::end(iterable)))
>
{
return Sorter{}(std::begin(iterable), std::end(iterable));
}
};
Run Code Online (Sandbox Code Playgroud)
在这个类中,has_sort是一个特征,用于检测分拣机是否有operator()过载Iterable&.它是使用检测成语的手动版本实现的:
template<typename Sorter, typename Iterable>
using has_sort_t = std::result_of_t<Sorter(Iterable&)>;
template<typename …Run Code Online (Sandbox Code Playgroud) 在《Effective modern C++》一书中,在第3项中写了这段代码:
template<typename Container, typename Index>
decltype(auto)
authAndAccess(Container&& c, Index i)
{
authenticateUser();
return std::forward<Container>(c)[i];
}
Run Code Online (Sandbox Code Playgroud)
我不明白你为什么打电话std::forward?如果c是右值引用,那么operator[]在右值而不是左值上调用 会发生什么变化?对我来说c[i]应该够了。
PS:我std::forward将变量作为函数参数的目的理解为:
template<typename T, typename... Ts>
std::unique_ptr<T> make_unique(Ts&&... params)
{
return std::unique_ptr<T>(new T(std::forward<Ts>(params)...));
}
Run Code Online (Sandbox Code Playgroud) 我遇到了需要一个具有相同输出的模板函数的问题,只要它的模板参数是相同的,与位置无关.鉴于总有两个参数.
我有一个功能:
template<typename Lhs, typename Rhs>
int func();
Run Code Online (Sandbox Code Playgroud)
我想func<int, float>()和func<float, int>()调用相同的代码.
我想过一个宏,我想避免使用它,但是当两种类型相同时我不需要重复代码.所以宏如:
#define DEF_TEMPL_IMPL(lhs, rhs, ret) \
template<>\
auto func<lhs, rhs>(){ return ret; }\
template<>\
auto func<rhs, lhs>(){ return func<lhs, rhs>(); }
Run Code Online (Sandbox Code Playgroud)
将无法编译因为DEF_TEMPL_IMPL(float, float, 3)会导致重新定义func<>
我认为SFINAE就是这里的答案,但我们无法想到解决方案.
我将继续思考这一点,但是在回答这个问题之前,堆栈溢出的一些优秀思想可能会比我能提出的更好或更优雅的解决方案.
那怎么能实现呢?
我最近在使用wxPython时遇到了一个问题:我想要整个wx.Menu变灰了,我找不到办法去做.我可以禁用与wx.Menu相关的所有wx.MenuItem实例,但我发现它在人体工程学方面的效率低于灰度化菜单本身.
wx.Menu类有一个名为Enable()的方法,它接受'enable'参数,但它的唯一用途是启用/禁用相关的wx.MenuItem而不是wx.Menu本身.实际上,我甚至不确定我想做什么.
但是,如果你有一些,我会很高兴听你的解决方案.
我试图编写一个可以像这样使用的编译时valarray:
constexpr array<double> a = { 1.0, 2.1, 3.2, 4.3, 5.4, 6.5 };
static_assert(a[0] == 1.0, "");
static_assert(a[3] == 4.3, "");
static_assert(a.size() == 6, "");
Run Code Online (Sandbox Code Playgroud)
我设法用以下实现来做它并且它工作正常(使用GCC 4.7):
#include <initializer_list>
template<typename T>
struct array
{
private:
const std::size_t _size;
const T* _data;
public:
constexpr array(std::initializer_list<T> values):
_size(values.size()),
_data(values.begin())
{}
constexpr auto operator[](std::size_t n)
-> T
{
return _data[n]
}
constexpr auto size() const
-> std::size_t;
{
return _size;
}
};
Run Code Online (Sandbox Code Playgroud)
虽然它对我来说很好,但我不确定它的行为,std::initializer_list并且可能会使用一些未定义的行为.
constexpr对于std::initializer_list构造函数,begin并且size很好,即使它不是严格来说C++ …
根据Herb Sutter(http://isocpp.org/blog/2012/12/you-dont-know-const-and-mutable-herb-sutter),在C++ 11中,const方法不能改变对象位 -明智的,或者如果它们具有可变数据成员,则必须执行内部同步(例如,使用互斥锁).
假设我有一个全局对象,我从多个线程访问,并假设它有可变成员.为了论证,让我们假设我们不能修改类的来源(它由第三方提供).
在C++ 98中,这些线程将使用全局互斥锁来同步对此对象的访问.因此,访问需要单个互斥锁定/解锁.
但是,在C++ 11中,对此对象的任何const成员函数调用也将调用内部同步,因此,对此对象进行单个const函数调用将花费2次锁定/解锁操作(或更多,具体取决于函数的数量)你从一个线程打电话).请注意,仍然需要全局互斥锁,因为const似乎对编写器没有任何作用(除非其中一个非const方法调用const方法,否则可能会减慢它们的速度).
所以,我的问题是:如果我们所有的类都必须在C++中这样(至少可以被STL使用),这是否会导致过度的同步措施?
谢谢
编辑:一些澄清:
似乎在C++ 11中,除非其const成员函数在内部同步(或不执行任何写入),否则不能将类与标准库一起使用.
虽然C++ 11本身不会自动添加任何同步代码,但是符合标准库的类不需要在C++ 98中进行同步,但在C++ 11中需要它.因此,在C++ 98中,您可以避免对可变成员进行任何内部同步,但在C++ 11中则不能.
在我的实现中,我为JavaScript提供了一个接受参数的函数。
v8::Handle<v8::Value> TableGetValueIdForValue(const v8::Arguments& args) {
v8::Isolate* isolate = v8::Isolate::GetCurrent();
v8::HandleScope handle_scope(isolate);
auto val = args[1];
if (val->IsNumber()) {
auto num = val->ToNumber();
// How to check if Int or Double
} else {
// val == string
}
}
Run Code Online (Sandbox Code Playgroud)
现在,此参数基本上可以具有任何类型。当我支持Int,Float和String时,我想有效地检查这些类型。使用IsNumber()和IsStringObject()我可以确保对象是数字或字符串。
但是现在我需要区分整数值和浮点数。进行此测试的最佳方法是什么?有没有一种方法可以调用/使用typeof暴露给JS 的函数?
我见过代码using namespace std;.这是否意味着如果我们使用它,那么我们不必在代码中包含头文件,或者如果我们不使用命名空间,这是否意味着我们必须std::在每个函数之前使用类?
我安装You Complete Me使用Vundle,然后跑了
cd ~/.vim/bundle/YouCompleteMe
./install.sh --clang-completer
Run Code Online (Sandbox Code Playgroud)
并补充说
let g:ycm_global_ycm_extra_conf = '~/.vim/bundle/YouCompleMe/cpp/ycm/.ycm_extra_conf.py'
Run Code Online (Sandbox Code Playgroud)
到我的vimrc档案.
现在当我编写C++11代码时,ycm给我语法错误!我究竟做错了什么?