小编Mel*_*kon的帖子

SFINAE:检测函数是否由编译时已知值调用

当我的一个ctors以编译时已知值调用时,我喜欢做一些检查.有没有办法检测它?

所以当有人称之为:

A a (10);
Run Code Online (Sandbox Code Playgroud)

因为10是一个已知的编译时间常数,所以我想调用一个特殊的ctor,如下所示:

template<int Value, typename = std::enable_if_t<Value <= 100>>
A (int Value) {}
Run Code Online (Sandbox Code Playgroud)

知道如何解决这个问题?谢谢!

c++ metaprogramming template-meta-programming

6
推荐指数
1
解决办法
212
查看次数

Mixin 是基于策略的设计的特例吗?

据我所知,mixin是先写派生类,然后通过模板参数注入基类。

示例:http : //www.drdobbs.com/cpp/mixin-based-programming-in-c/184404445

据我所知,基于策略的设计也是如此。 http://en.wikipedia.org/wiki/Policy-based_design

它并没有说你应该从它派生,你也可以以其他方式使用模板参数。然而,例如在维基百科基于策略的设计示例是这样的:

template<typename Base>
class Derive: private Base
Run Code Online (Sandbox Code Playgroud)

我认为这与 mixin 相同。(相反,在 mixin 中你通常使用公共继承)

它们之间有什么显着区别还是mixin是基于策略的设计的特例?

c++ design-patterns template-mixins policy-based-design

5
推荐指数
0
解决办法
653
查看次数

检查模板参数是否具有随机访问迭代器

我对元编程完全不熟悉,我有一些问题.我想写它有不同的内部表示,并使用不同的算法,如果传递的容器ContainerRandom Access Iterator.但是,我不知道如何检查它.

更新:现在我正在尝试以下内容:

template <typename Container>
struct HaveRandomAccessIterator
{
    typedef char yes[1];
    typedef char no[2];

    template <typename C>
    static yes& test (typename std::random_access_iterator_tag*);
    template <typename>
    static no& test (...);

    static const bool value = sizeof(test<std::iterator_traits<typename Container::iterator*>::iterator_category*>(0)) == sizeof(yes);
};
Run Code Online (Sandbox Code Playgroud)

但是它给了我std :: list的真正价值,并且我得到编译错误,因为在那种情况下我使用operator []

有人可以解释我怎样才能正确检查?

c++ templates iterator template-meta-programming

0
推荐指数
1
解决办法
1381
查看次数