#include <iostream>
#include <string>
template<typename... Strings>
class strOps {
public:
// Constructor to concatenate strings and calculate information
strOps(const Strings&... strings): Concatenated(concatenate(strings...)),
TotalStrings(Counts<sizeof...(strings)>),
TotalCharacters(count_characters(Concatenated))
{}
int get_count()
{
return TotalStrings;
}
int get_string_length()
{
return TotalCharacters;
}
std::string get_string()
{
return Concatenated;
}
private:
std::string Concatenated;
int TotalStrings;
int TotalCharacters;
// Counts total strings using variadic variable template
template<size_t... R>
static constexpr size_t Counts = (R + ...);
// Helper function to concatenate strings using fold expression
template<typename... Args>
std::string concatenate(const Args&... args) {
return (args + ...);
}
// Helper function to count total characters in a string
int count_characters(const std::string& str) {
return str.length();
}
};
// Variadic function template to display information
template<typename... Ts>
void display_info(Ts... ts) {
((std::cout << ts ), ...) << '\n';
}
int main() {
strOps<std::string, std::string, std::string, std::string, std::string>
strConcatenator("Hello ", "world", " in C++", " template metaprogramming", "!");
display_info("String: ", strConcatenator.get_string());
display_info("Total characters: ", strConcatenator.get_string_length());
display_info("Number of strings merged: ", strConcatenator.get_count());
return 0;
}