c++ - C++ 模板中条件代码实例化的最简洁方法

标签 c++ templates

我正在尝试运行以下 C++ 代码:

#include <cmath>

template<typename T, bool> class ConditionalData {
};

template <typename T> class ConditionalData<T, false> {
};

template <typename T> class ConditionalData<T, true> {
private:
    T data;
public:
    void setData(T _data) { data = _data; }
};


template<bool hasdata> class A {
public:
    A() {
        ConditionalData<double,hasdata> data;
        if (hasdata) {
            data.setData(sin(cos(123.4)));
        }
    }
};


int main(int argNum, const char**argData) {
    A<false> test1;
    A<true> test2;
    return 0;
}

本质上,我想实现一个模板类 A,其中根据模板参数执行某些操作。这些操作需要局部变量,我只想在需要时分配。我在这里遇到的问题是

if (hasdata) {
    data.setData(3);
}

condition 也被实例化为 hasdata=false,它不会编译(使用 g++ 5.2)。任何想法如何在不将 A::A() 的主体拆分成碎片的情况下以最干净的方式完成这项工作?

上面的源代码是一个最小的非工作示例。 A::A() 的实际实现相对较长,依赖于“hasdata”的部分均匀分布在代码中。此外,将使用类 A 的“类型名称 T”是一个相对复杂的类,具有重量级的构造函数/析构函数,因此我希望仅在 hasdata=true 时分配 T 的实例。最后,在 data.setData(...) 调用中,“...”中可能会有复杂的计算,只有在需要时才应该执行。

最佳答案

如果您负担得起 ,您可以将条件分支表示为通用 lambda。好处是它们捕获了周围的变量,并且解决方案不需要额外的成员函数。

template <bool> struct tag {};

template <typename T, typename F>
auto static_if(tag<true>, T t, F f) { return t; }

template <typename T, typename F>
auto static_if(tag<false>, T t, F f) { return f; }

template <bool B, typename T, typename F>
auto static_if(T t, F f) { return static_if(tag<B>{}, t, f); }

template <bool B, typename T>
auto static_if(T t) { return static_if(tag<B>{}, t, [](auto&&...){}); }

// ...

ConditionalData<int, hasdata> data;        
static_if<hasdata>([&](auto& d)
{
    d.setData(3);
})(data);

DEMO

你可以说:

if constexpr (hasdata)
{
    data.setData(3);
}

DEMO 2

关于c++ - C++ 模板中条件代码实例化的最简洁方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34589458/

相关文章:

c++ - 无法从 GetSystemTime() 获取毫秒数

c++ - 删除 vector<vector<Class>> 线程安全吗?

c++ - 需要澄清 SFINAE 中的 Lambdas、auto 和 decltype

c++ - 按大小存储字段的结构

c++ - 如何读取 Windows 7 上的启动时间事件?

c++ - 如何在以空格分隔的行中获得无限输入?

c++ - 类型特征定义。特征 blob 和元函数

c++ - 带有指向成员函数指针的模板

templates - 如何在 Umbraco 的页面上显示母版页的属性

java - 如何更改Eclipse提取方法模板?