相关疑难解决方法(0)

函数签名式表达式作为C++模板参数

我正在看Don Clugston的FastDelegate迷你库,并注意到一个奇怪的语法技巧,具有以下结构:

TemplateClass< void( int, int ) > Object;
Run Code Online (Sandbox Code Playgroud)

几乎看起来好像函数签名被用作模板实例声明的参数.

这种技术(其在FastDelegate中的存在显然是由于一个Jody Hagins)被用于简化模板实例的声明,其具有半任意数量的模板参数.

也就是说,它允许这样的事情如下:

// A template with one parameter
template<typename _T1>
struct Object1
{
    _T1 m_member1;
};

// A template with two parameters
template<typename _T1, typename _T2>
struct Object2
{
    _T1 m_member1;
    _T2 m_member2;
};

// A forward declaration
template<typename _Signature>
struct Object;

// Some derived types using "function signature"-style template parameters
template<typename _Dummy, typename _T1>
struct Object<_Dummy(_T1)> : public Object1<_T1> {};

template<typename _Dummy, typename _T1, typename _T2> …
Run Code Online (Sandbox Code Playgroud)

c++ templates

53
推荐指数
2
解决办法
2万
查看次数

arrow-> operator重载如何在c ++内部工作?

我理解正常的运算符重载.编译器可以直接将它们转换为方法调用.我不太清楚 - >运算符.我正在编写我的第一个自定义迭代器,我觉得需要 - >运算符.我看了一下stl源代码并实现了我自己的代码:

MyClass* MyClassIterator::operator->() const
{
    //m_iterator is a map<int, MyClass>::iterator in my code.
    return &(m_iterator->second);
}
Run Code Online (Sandbox Code Playgroud)

然后我可以使用MyClassIterator的实例,如:

myClassIterator->APublicMethodInMyClass().
Run Code Online (Sandbox Code Playgroud)

看起来编译器在这里做了两个步骤.1.调用 - >()方法获取一个临时的MyClass*变量.2.在temp变量上调用APublicMethodInMyClass使用其 - >运算符.

我的理解是否正确?

c++ operator-overloading

39
推荐指数
2
解决办法
2万
查看次数

Herb Sutters 如何监控课堂?

我试图了解 Herb Sutter 在 C++ 和 Beyond 2012 上展示的监视器类:

template<typename T>
class monitor {
private:
    mutable T t;
    mutable std::mutex m;

public:
    monitor(T t_ = T{}) : t{ t_ } {} 
    template<typename F>
    auto operator()(F f) const -> decltype(f(t))
    {
        std::lock_guard<std::mutex> _{ m }; return f(t);
    }
}; 
Run Code Online (Sandbox Code Playgroud)

我设法创建了一个以更老式和更简单(至少对我而言)的方式做同样事情的类:

template<typename T>
class MyMonitor {
public:
    MyMonitor() { t = T(); }

    template<typename F>
    auto callFunc(F f) {
        std::lock_guard<std::mutex> lock(m);
        return f(t);
    }

private:
    T          t;
    std::mutex m;
};  
Run Code Online (Sandbox Code Playgroud)

Herb Sutters …

c++ c++11

5
推荐指数
1
解决办法
196
查看次数

标签 统计

c++ ×3

c++11 ×1

operator-overloading ×1

templates ×1