#include <iostream>
#include <vector>
#include <variant>
#include <algorithm>
struct CreditCard {};
struct BankTransfer {};
using PaymentMethod = std::variant<CreditCard, BankTransfer>;
enum class Status {
Pending,
Processed
};
constexpr double CC_FEE_RATE = 0.02;
struct Transaction {
double amount;
PaymentMethod method;
Status status;
};
int main() {
std::vector<Transaction> transactions = {
{100.0, CreditCard{}, Status::Pending},
{200.0, BankTransfer{}, Status::Pending},
{50.0, CreditCard{}, Status::Pending}
};
// Process transactions
std::for_each(transactions.begin(), transactions.end(), [](Transaction& t) {
// Apply fee only if it is a CreditCard
if (std::holds_alternative<CreditCard>(t.method)) {
t.amount += (t.amount * CC_FEE_RATE);
}
// Update status using the scoped enum
t.status = Status::Processed;
});
// Output results
for (const auto& t : transactions) {
std::cout << "Amount: " << t.amount
<< " | Status: " << (t.status == Status::Processed ? "Processed" : "Pending")
<< "\n";
}
return 0;
}