前提・実現したいこと
完結にテンプレート処理が書きたい
発生している問題
型、数を気にしない関数を作ろうとしています。
具体的には以下のソースコードのように文字列がcharでもstd::stringでも気にせず渡せるようにしたいです。
しかしenable_if_tを使用すると以下のようにconstありなしが分けられるなど、とても冗長になってしまっています。
もっと簡潔に関数を書く方法はありますか?
該当のソースコード
cpp
1#include <iostream> 2#include <Windows.h> 3#include <shellapi.h> 4#include <vector> 5#include <algorithm> 6#include <string> 7#include <type_traits> 8 9using namespace std; 10 11 12// 数が増えすぎるのでは? 13template <typename T, typename U> 14enable_if_t<is_same<T, string>::value && is_same<U, char*>::value> cat_str(T str1, U str2) 15{ 16 cout << str1.length() + strlen(str2) << endl; 17} 18 19template <typename T, typename U> 20enable_if_t<is_same<T, char*>::value && is_same<U, string>::value> cat_str(T str1, U str2) 21{ 22 cout << strlen(str1) + str2.length() << endl; 23} 24 25template <typename T> 26enable_if_t<is_same<T, char*>::value> cat_str(T str1, T str2) 27{ 28 cout << str1.length() + str2.length() << endl; 29} 30 31template <typename T, typename U> 32enable_if_t<is_same<T, const char*>::value && is_same<U, char*>::value> cat_str(T str1, U str2) 33{ 34 cout << strlen(str1) + str2.length() << endl; 35} 36 37template <typename T, typename U> 38enable_if_t<is_same<T, char*>::value && is_same<U, const char*>::value> cat_str(T str1, U str2) 39{ 40 cout << strlen(str1) + str2.length() << endl; 41} 42 43template <typename T> 44enable_if_t<is_same<T, string>::value> cat_str(T str1, T str2) 45{ 46 cout << str1.length() + str2.length() << endl; 47} 48 49 50 51int main() { 52 char* str1 = "1234"; 53 const char* str2 = "5678"; 54 cat_str(str1, str2); 55 56 char* str3 = "12345"; 57 string str4 = "67890"; 58 cat_str(str3, str4); 59 60 const string str5 = "123456"; 61 string str6 = "789012"; 62 cat_str(str5, str6); 63}
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。