当前位置: 首页 > 知识库问答 >
问题:

如何使用布尔模板参数启用成员函数?

祁俊喆
2023-03-14

我希望一个类有两种不同的推送实现,并根据布尔模板参数进行选择。我尝试使用本答案中描述的SFINAE原则,如下所示:

template<class T, bool foo=true>
class Bar {
  template <>
  typename std::enable_if<foo>::type
  push(const T& value) { /* one implementation */}

  template <>
  typename std::enable_if<!foo>::type
  push(const T& value) { /* another implementation */ } 
}

然而,我在gcc下遇到了一个错误“不能在类范围内专门化函数push”,我不明白为什么。虽然我的代码与链接答案中的代码并不完全相同,但它似乎非常相似,我无法发现关键的区别。

我还尝试使用类似于此答案中建议的语法,但也不起作用(错误是“不能重新声明类成员”):

  template <bool enable=foo>
  typename std::enable_if<enable>::type
  push(const T& value) { /* one implementation */}

  template <bool enable=!foo>
  typename std::enable_if<enable>::type
  push(const T& value) { /* another implementation */ } 

我怎样才能做到这一点?

共有2个答案

颛孙正卿
2023-03-14

作为替代方案:

>

  • 如果在C 17中配置了constexr

    template<class T, bool foo=true>
    class Bar {
    public:
        void push(const T& value) {
            if constexpr(foo) {
                /* one implementation */
            } else {
                /* another implementation */
            }
        }
    };
    

    标签发送:

    template<class T, bool foo=true>
    class Bar {
        void push_impl(const T& value, std::true_type) {
            /* one implementation */
        } 
        void push_impl(const T& value, std::false_type) {
            /* another implementation */
        }
    
    public:
        void push(const T& value) {
            push_impl(value, std::integral_constant<bool, foo>{});
        }
    };
    

  • 萧宏远
    2023-03-14

    首先,SFINAE适用于函数模板重载;所以你应该使用第二种方法。但是你用相同的签名声明了两个重载;请注意,模板参数的默认参数不属于签名。

    把它改成

    template <bool enable=foo>
    typename std::enable_if<enable>::type
    //                      ~~~~~~
    push(const T& value) { /* one implementation */}
    
    template <bool enable=foo>
    typename std::enable_if<!enable>::type
    //                      ~~~~~~~
    push(const T& value) { /* another implementation */ } 
    
     类似资料:
    • 我想实现一个基于布尔模板参数的私有函数。大概是这样的: 但是上面的程序没有编译:错误:“struct std::enable_if”void funInternal(int a,typename std::enable_if::type*=0)中没有名为“type”的类型。 是否可以使用enable_if实现所需的行为?

    • 我试图使用基于模板的类作为另一个类的成员。另一个类将根据其数据成员值决定基于模板的成员应该使用的数据类型。为此,我使用了一点多态性来决定实例化的运行时。 然后,打印函数将根据 T 的类型进行打印,它是 int 还是 float。此时我收到链接器错误。 错误LNK2019:未解析的外部符号" public:_ this call template dynamic::template dynamic(

    • 我有一个这样的类: 返回从town参数到路径的。 我试图做的是为优先级队列重载布尔运算符,但它给了我错误 我知道为什么它会给我这个错误,但是我不知道如何在< code>Comparator结构中使用一个非静态函数。 > 必须是非静态的 我尝试在类中移动但没有成功 我需要用一个结构重载运算符,因为我需要在上使用两个不同的bool重载,用于两种不同的情况,但参数相同(两个城镇)。换句话说,我需要结构,

    • 我有一个模板化的C++类,它也有一个模板化的成员函数。这个成员函数的模板参数以特定的方式依赖于类的模板参数(请参阅下面的代码)。我正在为其模板参数的两个不同值实例化(而不是专门化)该类。一切都在这一点上进行。但是,如果我调用模板化的成员函数,对第一个实例化对象的调用只会编译,而不会编译第二个。似乎编译器没有为模板类的第二次实例化实例化模板化成员函数。我正在使用“g++filename.cpp”编译

    • 我有以下模板方法: 但是我得到了那些奇怪的链接错误: /usr/lib/gcc/x86_64-redhat-linux/4.4。7/../../../../包括/c/4.4。7/例外:62:void MyStruct::readField(std::basic_istream)的多重定义 如何专门化此成员函数? 编辑 这种方法在以下方面起作用: 或者使用s或在类外使用

    • 本质上,我想要一个具有数组的模板类,其大小是一个模板参数,以保存常量内容。 类似于: 我一直在搜索和修补一点,几乎有一个解决方法实现了一个中间静态方法,并使用std::array: ...这已经是相当多的样板,但仍然d::array似乎不是从初始化列表中构建的?:-(