Я пытаюсь запустить следующий код на С++:
#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);
}
Условие также создается для hasdata = false, которое не компилируется (с использованием g++ 5.2). Любые идеи, как это сделать самым чистым способом, не разбивая тело A:: A() на куски?
Исходный код, приведенный выше, является минимальным нерабочим примером. Реальная реализация для A:: A() относительно длинная, причем части, зависящие от "hasdata", распределяются равномерно по коду. Кроме того, "typename T", для которого будет использоваться класс A, является относительно сложным классом с тяжелыми конструкторами/деструкторами, поэтому я хочу, чтобы экземпляры T были выделены только при hasdata = true. Наконец, в вызовах data.setData(...) могут быть сложные вычисления в "...", которые должны выполняться только при необходимости.