std :: enable_if有条件地编译构造函数

时间:2018-08-02 17:25:46

标签: c++ templates g++ c++17 sfinae

我试图根据传递的输入类型自动选择一个构造函数,同时还避免了手动编写类模板参数的麻烦。

template <typename T>
class A {
    public:
        static constexpr bool isP = std::is_pointer_v<T>;

        template <typename = std::enable_if_t<isP>>
        A(T t) {
            std::cout << (*t) << '\n';
        }

        template <typename = std::enable_if_t<!isP>>
        A(T t) {
            std::cout << t << '\n';
        }
};

这不起作用,并且失败:

test.cpp:18:9: error: ‘template<class T> template<class> A<T>::A(T)’ cannot be overloaded
         A(T t) {
         ^
test.cpp:13:9: error: with ‘template<class T> template<class> A<T>::A(T)’
         A(T t) {
         ^

This question解决了类似的情况,即需要有条件地编译两个成员函数。同时,我在推导构造函数时推导出模板参数,因此我不确定该过程应该如何进行。

即使尝试应用通用解决方案也给了我一个奇怪的结果。如果我使用类似的东西:

template <bool x = isP, typename = std::enable_if_t<x>>

在两个构造函数之一中,然后我的代码成功编译(g++7.2.0)。但是,如果我在两者上都使用它,例如:

template <typename T>
class A {
    public:
        static constexpr bool isP = std::is_pointer_v<T>;

        template <bool x = isP, typename = std::enable_if_t<x>>
        A(T t) {
            std::cout << (*t) << '\n';
        }

        template <bool x = !isP, typename = std::enable_if_t<x>>
        A(T t) {
            std::cout << t << '\n';
        }
};

它再次失败!

为什么会发生这种情况,为什么当我仅在两个构造函数之一上使用此技巧时,它为什么会起作用?

0 个答案:

没有答案