c++ - 如果默认可构造,则默认参数

标签 c++ templates c++11 sfinae

我有一个小问题,我的代码可以工作,但并不理想。

我有一个将谓词作为参数的函数。我想支持这些语法:

myClass.foo([](auto param){ return true; }); // predicate sent as parameter
myClass.foo<PredicateType>(); // predicate type sent as template argument
myClass.foo(); // default predicate took

但是,为了做到这一点,我复制了这样的函数:

struct MyClass {
    template<typename Predicate = DefaultPredicate&&, std::enable_if_t<std::is_default_constructible<detail::decay_t<Predicate>>::value, int> = 0>
    void foo(Predicate&& p = std::decay_t<Predicate>{}) {
        // stuff...
    }

    template<typename Predicate, std::enable_if_t<!std::is_default_constructible<detail::decay_t<Predicate>>::value, int> = 0>
    void foo(Predicate&& p) {
        // exact same stuff...
    }
};

有没有办法在不复制我的代码的情况下做到这一点? 理想的是具有一种功能。我该怎么做,最好是在 C++11 中?

最佳答案

去掉毫无意义的 SFINAE 和同样毫无意义的衰变:

struct MyClass {
    template<typename Predicate = DefaultPredicate>
    void foo(Predicate&& p = Predicate{}) {
        // stuff...
    }    
};

默认函数参数是单独实例化的,并且仅在实际需要时才实例化。

关于c++ - 如果默认可构造,则默认参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37330423/

相关文章:

c++ - 用作函数参数时将默认值设置为 C 数组

c++ - lambda-capture by reference 中的 this 指针

c++ - decltype、result_of 还是 typeof?

c++ - 是否可以将包含 lt 或 gt 运算符的表达式作为模板参数传递?

templates - 同一 symfony 应用程序中不同 View 的不同布局

C++ 对重载函数的模糊调用

c++ - 从可调用参数创建的线程对象参数移动构建 C++11 线程

c++ - const 引用与特定示例的混淆

c++ - 矩形碰撞检测

c++ - 宏和多行注释