enum class AllowedTypes : uint8_t
{
Int8 = 0,
Uint8,
Int16,
Uint16,
};
template< AllowedTypes TYPE >
struct AllowedType;
template<>
struct AllowedType<AllowedTypes::Int8>
{
using Type = int8_t;
};
template<>
struct AllowedType<AllowedTypes::Uint8>
{
using Type = uint8_t;
};
template<>
struct AllowedType<AllowedTypes::Int16>
{
using Type = int16_t;
};
template<>
struct AllowedType<AllowedTypes::Uint16>
{
using Type = uint16_t;
};
template< AllowedTypes TYPE >
struct spi
{
typename AllowedType<TYPE>::Type* p_tx = nullptr;
constexpr spi() {};
};
// Example program
#include <typeinfo>
#include <iostream>
#include <string>
#include <cstdint>
enum class AllowedTypes : uint8_t
{
Int8 = 0,
Uint8,
Int16,
Uint16,
};
template< AllowedTypes TYPE >
struct AllowedType;
template<>
struct AllowedType<AllowedTypes::Int8>
{
using Type = int8_t;
};
template<>
struct AllowedType<AllowedTypes::Uint8>
{
using Type = uint8_t;
};
template<>
struct AllowedType<AllowedTypes::Int16>
{
using Type = int16_t;
};
template<>
struct AllowedType<AllowedTypes::Uint16>
{
using Type = uint16_t;
};
template< AllowedTypes TYPE >
using TypeFor = typename AllowedType<TYPE>::Type;
template< AllowedTypes TYPE >
struct spi
{
TypeFor<TYPE>* p_tx = nullptr;
constexpr spi() {};
};
int main()
{
spi<AllowedTypes::Int8> spi1;
std::cout << typeid( *spi1.p_tx ).name() << " " << sizeof( *spi1.p_tx ) << std::endl;
spi<AllowedTypes::Uint16> spi2;
std::cout << typeid( *spi2.p_tx ).name() << " " << sizeof( *spi2.p_tx ) << std::endl;
return 0;
}
#include <iostream>
#define square(x) x*x
int main() {
int var = square(5 + 5);
std::cout << var << std::endl;
}
#include <iostream>
template <typename T>
inline T square(T val)
{
return val * val;
}
int main() {
int var = square(5 + 5);
std::cout << var << std::endl;
}
void _exit(int i);//Завершение программы. Не актуально для контроллера (если только у вас нет системы или какого-нибудь "менеджера процессов") - сделайте бесконечный цикл или рестарт
int _open(const char *name, int flags, int mode); //открытие файла или устройства, типа UART
int _read(int file, char *ptr, int len); //Чтение из файла или устройства, типа UART
int _write(int file, char *buffer, unsigned int count); //Запись в файл или устройство, типа UART
int _lseek(int file, int ptr, int dir);//Честно говоря не помню, кажется перемещение "текущей" позиции чтения/записи в файле
int _fstat(int file, struct stat *st);//Смотрите что делает аналогичная функция в стандартной библиотеке, я точно не помню, но что-то с получением инфы о файле/устройстве
int _link(char *old, char *new); //
int _unlink(char *name); //Если не ошибаюсь, удаление ссылки на файл (если она последняя - то удаление самого файла)
int _stat(char *file, struct stat *st);//ХЗ, не помню
int _close(int file);//Закрытие файла/устройства
int _execve(char *name, char **argv, char **env);//хз
int _fork();//Форк процесса. (см. выше про процессы)
int _getpid(); //Получение ID процесса (см. выше про процессы)
int _isatty(int file);//Судя по названию - проверка является-ли файл терминалом (фактически для контроллера проверка на UART)
int _kill(int pid, int sig);//Убийство процесса (см. выше про процессы)
caddr_t _sbrk(int incr);//хз
int times(struct tm *buf);//хз
int _wait(int *status);//Ожидание завершения потока (см. выше про процессы)
var scrollViewer = myListBox.GetFirstDescendantOfType<ScrollViewer>();