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

如何根据模板参数设置方法常数?

钱钊
2023-03-14

我有一个带有模板参数的类,我想调用它的一个方法。它看起来像这样:

template <typename T>
class Foo {
public:
    void doSomething() {
        for (auto& t: ts) {
            t.doSomething();
        }
    }
private:
    std::vector<T> ts;
};

这是可行的,但如果T本身是常量(假设T::doSomething()也将是常量),我想使doSomething()成为常量。我找到了一个可能的解决方案(基于这个问题),但我不喜欢。

template <bool enabled = std::is_const<T>::value>
typename std::enable_if<enabled, void>::type
doSomething() const {
    for (auto& t: ts) {
        t.doSomething();
    }
}

template <bool enabled = !std::is_const<T>::value>
typename std::enable_if<enabled, void>::type
doSomething() {
    for (auto& t: ts) {
        t.doSomething();
    }
}

它工作正常,但有代码重复。有什么办法可以避免吗?

共有1个答案

薄烨
2023-03-14

虽然不完美,但这里有一个解决方法:我们有一个非const成员_doSomething(),其中const和非const的代码相同,除了在底层对象上调用的函数。由于此成员是nonconst,我们必须const_castthis才能从const Foo调用它。

由于\u doSomething中的代码是常量安全的,因此(常量)将常量丢弃是安全的。

你的代码也不会编译成常量,因为你不能拥有constvector。向量的元素必须是可赋值的,而常量类型通常是不可赋值的(但它们确实不应该是:https://stackoverflow.com/a/17313104/258418).
您可能需要考虑std::vector

#include <iostream>
#include <vector>

using namespace std;

class Bar {
public:
    Bar() {}
    void doSomething() const {
        std::cout << "const" << endl;
    }

    void doSomething() {
        std::cout << "NON const" << endl;
    }
};


template <typename T>
class Foo {
    void _doSomething() {
        /*for (auto& t: ts) {
            t.doSomething();
        }*/
        test.doSomething();
    }
public:
    Foo()/*T element) : ts({element})*/ {}

    template <bool enabled = std::is_const<T>::value>
    typename std::enable_if<enabled, void>::type
    doSomething() const {
        const_cast<typename std::remove_const<Foo<T>>::type*>(this)->_doSomething();
    }

    template <bool enabled = !std::is_const<T>::value>
    typename std::enable_if<enabled, void>::type
    doSomething() {
        _doSomething();
    }
private:
    //std::vector<T> ts; https://stackoverflow.com/a/17313104/258418
    T test;
};

int main()
{
    Foo<Bar> nonConstInst;
    Foo<const Bar> ConstInst;

    nonConstInst.doSomething();
    ConstInst.doSomething();
    return 0;
}

 类似资料:
  • 问题内容: 我有一个项目,需要根据用户选择的选择参数设置环境变量。每个项目都有一个主题项目依赖项。我想让用户选择项目,然后从属性文件中加载主题名称。就像是 如果用户从choice参数中选择,我想自动设置为。最好的方法是什么? 每当添加新项目时,我都不想修改Jenkins作业配置。相反,我想将映射保存在文件中,以便可以在版本控制中使用它。 问题答案: 啊哈,我找到了一个简单的解决方案!使用EnvIn

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

  • 1)审批模板设置/添加/编辑 ①模板管理-新建模板-可自定义模板/直接选择提供的模板快速创建 ②填写模板信息,完成表单设计:审批设计器-拖动控件库-右侧自由编辑控件及表单-设置可见范围 2)审批流程设置 添加审批步骤-设置审批人(同一审批步骤存在多个审批人可选择审批方式)-设置每个步骤的审批人的表单查看权限-预设抄送人 ①设置审批步骤 ②设置审批人 ③选择审批方式 ④设置表单权限 ⑤预设抄送人

  • 我正在尝试根据传递到作业中的参数在Jenkins管道作业中设置环境变量;这样,我可以在需要它的管道的每个阶段使用环境变量。我尝试在环境块中使用Switch语句: 然而,这并不起作用,该作业试图将等号之前的所有行评估为KEY名称: 我该如何让它工作?

  • 我想通过另一个模板参数来指定模板化函数的返回类型。所有这些都在一个类中。 在头文件中:

  • Docker for windows:2.0.0.3(31259) 我在docker中运行elasticsearch和kibana。elasticsearch运行。但是kibana不能运行。它总是尝试连接超文本传输协议://elasticsearch: 9200。我设置了ELASTICSEARCH_URLkibana命令。但不起作用 要求http://localhost:5601/.Kibana服