🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

846閲覧

charでもstringでも受け取れる関数を簡潔に書きたい

__ook

総合スコア49

C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/11/29 08:35

前提・実現したいこと

完結にテンプレート処理が書きたい

発生している問題

型、数を気にしない関数を作ろうとしています。
具体的には以下のソースコードのように文字列が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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

c++

1void cat_str(const string &str1, const string &str2) 2{ 3 cout << str1.length() + str2.length() << endl; 4}

でいいと思いますよ

投稿2019/11/29 08:44

asm

総合スコア15149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

組合せ爆発的に定義が増えてしまう問題の解決策、という話であれば、以下の方針で実装すれば良いと思います。

c++

1template <typename T> 2enable_if_t<is_same<T, string>::value, size_t> get_length(T str) { 3 return str.length(); 4} 5 6template <typename T> 7enable_if_t<is_same<T, const char*>::value, size_t> get_length(T str) { 8 return strlen(str); 9} 10 11template <typename T, typename U> 12void cat_str(const T& str1, const U& str2) 13{ 14 cout << get_length(str1) + get_length(str2) << endl; 15}

投稿2019/11/29 17:33

maai

総合スコア463

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

__ook

2019/12/02 00:42

とても参考になりました。ありがとうございます。 ただ、 enable_if_t<is_same<T, const char*>::value, size_t> のsize_tはなぜ入れているのでしょう?
yumetodo

2019/12/02 04:36

戻り値の型はsize_tですよね?
__ook

2019/12/02 06:19

理解しました。ありがとうございました。
guest

0

C++17ならstd::string_viewを使うといいでしょう。
https://cpprefjp.github.io/reference/string_view/basic_string_view.html

投稿2019/11/29 09:47

yumetodo

総合スコア5852

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

__ook

2019/12/02 00:43

C++14です… 参考になります。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問