Функция шаблона «void» возвращает значениеC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Функция шаблона «void» возвращает значение

Сообщение 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;
}


Подробнее здесь: https://stackoverflow.com/questions/797 ... ng-a-value
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»