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

基于布尔模板参数的启用方法

狄德泽
2023-03-14

我想实现一个基于布尔模板参数的私有函数。大概是这样的:

#include <iostream>

using namespace std;

template <bool is_enabled = true>
class Aggregator {
public:
    void fun(int a) {
        funInternal(a);
    }

private:
    void funInternal(int a, typename std::enable_if<is_enabled>::type* = 0) {
        std::cout << "Feature is enabled!" << std::endl;
    }

    void funInternal(int a, typename std::enable_if<!is_enabled>::type* = 0) {
        std::cout << "Feature is disabled!" << std::endl;
    }
};

int main()
{
   Aggregator<true> a1;
   Aggregator<false> a2;

   a1.fun(5);
   a2.fun(5);

   return 0;
}

但是上面的程序没有编译:错误:“struct std::enable_if”void funInternal(int a,typename std::enable_if::type*=0)中没有名为“type”的类型。

是否可以使用enable_if实现所需的行为?

共有1个答案

吕利
2023-03-14

以下是@chris在评论中提供的解决方案(http://coliru.stacked-crooked.com/A/480dd15245cdbb6f)的改编版,似乎符合你的需求。

#include <iostream>

template<bool is_enabled = true>
class Aggregator
{
public:
    void fun(int a)
    {
        funInternal(a);
    }

private:
    template<bool enabled = is_enabled>
    void funInternal(typename std::enable_if<enabled, int>::type a)
    {
        std::cout << "Feature is enabled!" << std::endl;
    }

    template<bool enabled = is_enabled>
    void funInternal(typename std::enable_if<!enabled, int>::type a)
    {
        std::cout << "Feature is disabled!" << std::endl;
    }
};

int main()
{
    Aggregator<true> a1;
    Aggregator<false> a2;

    a1.fun(5);
    a2.fun(5);

    return 0;
}
 类似资料:
  • 我希望一个类有两种不同的实现,并根据布尔模板参数进行选择。我尝试使用本答案中描述的SFINAE原则,如下所示: 然而,我在gcc下遇到了一个错误“不能在类范围内专门化函数”,我不明白为什么。虽然我的代码与链接答案中的代码并不完全相同,但它似乎非常相似,我无法发现关键的区别。 我还尝试使用类似于此答案中建议的语法,但也不起作用(错误是“不能重新声明类成员”): 我怎样才能做到这一点?

  • 我正在寻找如何根据XML文件中的参数将模板应用于XML文件。 XML文件具有以下格式: XML文件由另一个程序生成,需要特定的输出格式,具体取决于参数“outt-type”的值。如果必须同时为多个输出生成结果,则此参数可能会出现多次,因此需要一个循环。 以下是一个具有多个输出类型参数的示例: 我想创建一个主模板文件。xsl,并在文件中导入/包括其他模板文件(generate-type-1.xsl、

  • std=C14的g在函子类的模板方法(本身不是模板)上给我一个“无法推断模板参数'Key'”错误。我不知道为什么。代码看起来应该可以工作。 我正在实现一个2-3树,它有一个采用函子的层次顺序遍历方法。操作人员tree23代码基本上是这样的: 级别顺序遍历调用仿函数的函数调用操作符,向其传递两个参数。 函子非常简单:

  • 好的,这是我的第一篇帖子。首先,我一直试图自己解决这个问题,但已经过了几个小时了,我还是迷路了。我试着在网上搜索,但没有找到足够具体的答案。以下是本项目的要求: 这是我到目前为止所拥有的: 现在,我试着改变各种事情。比如使用firstLastCheck(nameofArrayVariable)。通常它需要一个标识符,但如果我让它工作,它就不能将数组int作为布尔值返回。我还感到困惑的是,没有指令首

  • 我有一个下面的类模板 给出以下错误: tmp.cc:19:27:错误:无法专门化(使用“template<>”)未专门化模板constexpr int MyClass::ArraySize<0>()的成员{return 0;} 有可能达到预期的行为吗?使用C++14/C++17特性的解决方案(我想如果-constexpr应该是可能的)受到欢迎,但不能解决我的特定问题,因为只有C++11可用。

  • 问题内容: 我正在寻找一种基于布尔值对Swift数组进行排序的方法。 我已经使用强制转换为NSArray来工作了: 但是我在寻找Swift变体,有什么想法吗? 更新 感谢Arkku,我设法使用以下代码修复了此问题: 问题答案: 斯威夫特的阵列可以在适当的位置进行排序或用新的阵列。这两个函数的单个参数都是一个闭合,该闭合带有两个元素,如果第一个元素在第二个元素之前被排序,则返回。使用闭包的参数的最短