В строке return $ log, "testvoid4"; < /code> Я получаю эту ошибку компиляции:
'void' function returning a value
Я не понимаю, почему, когда $ log, вызывается только одним аргументом void_wrapper , возвращает что -то еще, кроме void .
Как я могу сделать этот код/работа , не модифицируя что -либо в тестовых функциях? т.е. $ log, оператор Comma всегда возвращает void , $ log () Оператор возвращает значение.
#pragma once
#include
#include
#include
class Log
{
public:
std::string buffer;
Log(){}
template
Log& operator,(const T& arg)
{
if constexpr (std::is_same_v)
buffer += " " + arg;
else if constexpr (std::is_same_v)
buffer += " " + std::to_string(arg);
else if constexpr (std::is_same_v)
buffer += std::string(" ") + arg;
return *this;
}
~Log()
{
OutputDebugStringA((buffer + "\n\n").c_str());
}
};
// For non-void functions: return $log(value), "message", "args"...
template
struct return_wrapper {
T value;
std::tuple args;
return_wrapper(T val) : value(std::move(val)) {}
return_wrapper(T val, std::tuple a) : value(std::move(val)), args(std::move(a)) {}
template
auto operator,(U&& arg) && {
auto new_args = std::tuple_cat(std::move(args), std::make_tuple(std::forward(arg)));
return return_wrapper(std::move(value), std::move(new_args));
}
operator T() && {
if constexpr (sizeof...(Args) > 0) {
std::apply([](const auto&... args) {
(Log(), ... , args);
}, args);
}
return std::move(value);
}
};
// For void functions: $log, "message", "args"...
template
struct void_wrapper {
std::tuple args;
template
void_wrapper(Us&&... a) : args(std::forward(a)...) {}
template
void operator,(U&& arg) && {
auto new_args = std::tuple_cat(std::move(args), std::make_tuple(std::forward(arg)));
std::apply([](const auto&... args) {
(Log(), ... , args);
}, std::move(new_args));
}
};
struct log_unified {
// For void functions: $log, "message", "args"...
template
auto operator,(T&& arg) const {
return void_wrapper(std::forward(arg));
}
// For non-void functions: return $log(value), "message", "args"...
template
auto operator()(T&& value) const {
return return_wrapper(std::forward(value));
}
};
constexpr log_unified $log{};
void testVoid()
{
$log, "testVoid", "testVoid______";
}
void testVoid2()
{
return $log, "testVoid2", "testVoid2______";
}
void testVoid3() {
std::string str = "testVoid3";
int x = 3333;
return $log, str, x;
}
void testVoid4() {
return $log, "testVoid4";
}
std::string testString()
{
std::string str = "hello world";
int x = 10;
return $log(str), "testString", "testString______", x;
}
bool test()
{
std::string testStr = "hello world";
testVoid();
testVoid2();
testVoid3();
testVoid4();
auto z = testString();
return $log(false), "test123 " + testStr, testStr;
}
int main()
{
test();
return 0;
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... ng-a-value
Функция шаблона «void» возвращает значение ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1752758375
Anonymous
В строке return $ log, "testvoid4"; < /code> Я получаю эту ошибку компиляции:
'void' function returning a value
Я не понимаю, почему, когда $ log, вызывается только одним аргументом void_wrapper , возвращает что -то еще, кроме void .
Как я могу сделать этот код/работа , не модифицируя что -либо в тестовых функциях? т.е. $ log, оператор Comma всегда возвращает void , $ log () Оператор возвращает значение.
#pragma once
#include
#include
#include
class Log
{
public:
std::string buffer;
Log(){}
template
Log& operator,(const T& arg)
{
if constexpr (std::is_same_v)
buffer += " " + arg;
else if constexpr (std::is_same_v)
buffer += " " + std::to_string(arg);
else if constexpr (std::is_same_v)
buffer += std::string(" ") + arg;
return *this;
}
~Log()
{
OutputDebugStringA((buffer + "\n\n").c_str());
}
};
// For non-void functions: return $log(value), "message", "args"...
template
struct return_wrapper {
T value;
std::tuple args;
return_wrapper(T val) : value(std::move(val)) {}
return_wrapper(T val, std::tuple a) : value(std::move(val)), args(std::move(a)) {}
template
auto operator,(U&& arg) && {
auto new_args = std::tuple_cat(std::move(args), std::make_tuple(std::forward(arg)));
return return_wrapper(std::move(value), std::move(new_args));
}
operator T() && {
if constexpr (sizeof...(Args) > 0) {
std::apply([](const auto&... args) {
(Log(), ... , args);
}, args);
}
return std::move(value);
}
};
// For void functions: $log, "message", "args"...
template
struct void_wrapper {
std::tuple args;
template
void_wrapper(Us&&... a) : args(std::forward(a)...) {}
template
void operator,(U&& arg) && {
auto new_args = std::tuple_cat(std::move(args), std::make_tuple(std::forward(arg)));
std::apply([](const auto&... args) {
(Log(), ... , args);
}, std::move(new_args));
}
};
struct log_unified {
// For void functions: $log, "message", "args"...
template
auto operator,(T&& arg) const {
return void_wrapper(std::forward(arg));
}
// For non-void functions: return $log(value), "message", "args"...
template
auto operator()(T&& value) const {
return return_wrapper(std::forward(value));
}
};
constexpr log_unified $log{};
void testVoid()
{
$log, "testVoid", "testVoid______";
}
void testVoid2()
{
return $log, "testVoid2", "testVoid2______";
}
void testVoid3() {
std::string str = "testVoid3";
int x = 3333;
return $log, str, x;
}
void testVoid4() {
return $log, "testVoid4";
}
std::string testString()
{
std::string str = "hello world";
int x = 10;
return $log(str), "testString", "testString______", x;
}
bool test()
{
std::string testStr = "hello world";
testVoid();
testVoid2();
testVoid3();
testVoid4();
auto z = testString();
return $log(false), "test123 " + testStr, testStr;
}
int main()
{
test();
return 0;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79702966/template-void-function-returning-a-value[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия