c 类构造函数模板,带有std :: enable_if和std :: decay

c++ class constructor template with std::enable_if and std::decay

本文关键字:std enable if decay 带有 函数模板      更新时间:2023-10-16
class DirectoryEntry; // forward declaration
template <class T>
struct isPathable { static const bool value = false; };
template<> struct isPathable<char*>
{
    static const bool value = true;
};
template<> struct isPathable<const char*>
{
    static const bool value = true;
};
template<> struct isPathable<std::string>
{
    static const bool value = true;
};
template<> struct isPathable<std::vector<char> >
{
    static const bool value = true;
};
template<> struct isPathable<std::list<char> >
{
    static const bool value = true;
};
template<> struct isPathable<DirectoryEntry>
{
    static const bool value = true;
};
class path
{
private:
    std::string m_pathname;
public:
    // constructors:
    // ------------------------
    path() noexcept {}
    path(const path &p) : m_pathname(p.m_pathname) {}
    template <class Source>
    path(Source const &source,
        std::enable_if_t<isPathable<std::decay_t<Source>> >* = 0)
    {
        // do stuff
    }
...
};

我收到以下错误消息:

/usr/bin/c++   -I../lib -Wall -Werror -std=c++17 -g   -pthread -MD -MT app/CMakeFiles/infinityApp.dir/src/main.cpp.o -MF app/CMakeFiles/infinityApp.dir/src/main.cpp.o.d -o app/CMakeFiles/infinityApp.dir/src/main.cpp.o -c ../app/src/main.cpp
error: type/value mismatch at argument 1 in template parameter list for ‘template<bool _Cond, class _Tp> using enable_if_t = typename std::enable_if::type’
std::enable_if_t<isPathable<std::decay_t<Source>> >* = 0)
                                                  ^
note:   expected a constant of type ‘bool’, got ‘isPathable<typename std::decay<_Tp>::type>’

从错误消息中,我看到了可操纵的部分存在问题,因为它不会传递在布尔上,但我不明白为什么。问题在哪里,我应该如何更改代码?也许可以更好地解决此类问题?

template<> struct isPathable<char*>
{
    static const bool value = true;
};

您以这种方式定义了一堆专业。您的专业定义了布尔成员value,以true初始化。在您的构造函数中:

/* ... */ std::enable_if_t<isPathable<std::decay_t<Source>> >* = 0)

请注意,到std::enable_if_t的模板参数是一个布尔值,但是如果您在此处解析了指定的内容,则将typename指定为模板参数。显然,您的意思是...

的行
/* ... */ std::enable_if_t<isPathable<std::decay_t<Source>>::value >* = 0)

您可以尝试改进模板的其他一些调整:

  • 将您的类成员定义为constexpr,而不仅仅是const

  • 您可以通过做类似的操作来避免使用虚拟的形式参数:

    template <class Source,
          std::enable_if_t<isPathable<std::decay_t<Source>>::value >>
    path(Source const &source)
    {
        // do stuff
    }