Опитвам се да дефинирам шаблонен клас, който има шаблонен параметър без тип от дефиниран от потребителя тип. За съжаление засега без успех. Истинският код е твърде дълъг, но опростен пример изглежда така:
#include <iostream>
template <class T>
class Maybe {
bool is_ = false;
T value_;
public:
constexpr Maybe() = default;
constexpr Maybe(T value) : is_(true), value_(value) {}
constexpr bool is() const { return is_; }
};
template <Maybe<int> parm>
struct Test {
void say() const {
std::cout << "parm is " << (parm.is() ? "set" : "not set") << ".\n";
}
};
int main() {
Test<Maybe<int>{}> not_set;
Test<Maybe<int>(2)> is_set;
not_set.say();
is_set.say();
}
Когато се опитвам да компилирам този код (с Clang 3.4), получавам следното съобщение за грешка:
test.cc:15:22: error: a non-type template parameter cannot have type
'Maybe<int>'
template <Maybe<int> parm>
^
test.cc:23:10: error: value of type 'Maybe<int>' is not implicitly
convertible to 'int'
Test<Maybe<int>{}> not_set;
^~~~~~~~~~~~
test.cc:24:10: error: value of type 'Maybe<int>' is not implicitly
convertible to 'int'
Test<Maybe<int>(2)> is_set;
^~~~~~~~~~~~~
3 errors generated.
Сега знам, че параметър на шаблон без тип трябва да отговаря на някои условия. Мислех обаче, че да съм constexpr би било достатъчно. Или наистина може да е само един от вградените интегрални типове?
Има ли начин да предам параметри на шаблон без тип от моя собствен дефиниран от потребителя тип?