--- /dev/null
+add_library(pepper_str INTERFACE)
+target_include_directories(pepper_str INTERFACE include)
+
+if(NOT ENABLE_TEST)
+ return()
+endif(NOT ENABLE_TEST)
+
+# Google Test is mandatory for test
+nncc_find_package(GTest REQUIRED)
+
+GTest_AddTest(pepper_str_test test.cpp)
+target_link_libraries(pepper_str_test pepper_str)
--- /dev/null
+# pepper-str
+
+Let us simulate string interpolation in C++!
+
+## HOW TO USE
+
+```cxx
+#include <pepper/str.h>
+
+int main(int argc, char **argv)
+{
+ std::cout << pepper::str("There are ", argc, " arguments") << std::endl;
+ return 0;
+}
+```
--- /dev/null
+/*
+ * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __PEPPER_STR_H__
+#define __PEPPER_STR_H__
+
+#include <ostream>
+#include <sstream>
+
+#include <string>
+
+namespace pepper
+{
+namespace details
+{
+
+template <typename... Arg> void str_impl(std::ostream &os, Arg &&... args);
+
+template <> void str_impl(std::ostream &os)
+{
+ // DO NOTHING
+ return;
+}
+
+template <typename Arg> void str_impl(std::ostream &os, Arg &&arg) { os << std::forward<Arg>(arg); }
+
+template <typename Arg, typename... Args>
+void str_impl(std::ostream &os, Arg &&arg, Args &&... args)
+{
+ str_impl(os, std::forward<Arg>(arg));
+ str_impl(os, std::forward<Args>(args)...);
+}
+
+} // namesapce details
+} // namespace pepper
+
+namespace pepper
+{
+
+template <typename... Args> static inline std::string str(Args &&... args)
+{
+ std::stringstream ss;
+ details::str_impl(ss, std::forward<Args>(args)...);
+ return ss.str();
+}
+
+} // namespace pepper
+
+#endif // __PEPPER_STR_H__
--- /dev/null
+/*
+ * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "pepper/str.h"
+
+#include <iostream>
+
+#include <gtest/gtest.h>
+
+TEST(StrTests, README)
+{
+ // Let us check whether the example in README.md works!
+ int argc = 4;
+
+ std::cout << pepper::str("There are ", argc, " arguments") << std::endl;
+
+ SUCCEED();
+}
+
+TEST(StrTests, Empty)
+{
+ // pepper::str() returns an empty string
+ ASSERT_EQ(pepper::str(), "");
+}
+
+TEST(StrTests, Single_Int)
+{
+ // Convert a single "int" value as a string
+ ASSERT_EQ(pepper::str(3), "3");
+}
+
+TEST(StrTests, Concat_000)
+{
+ const int n = 3;
+ const int m = 4;
+
+ ASSERT_EQ(pepper::str(n, "+", m, "=", n + m), "3+4=7");
+}