次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part137 (正しくはpart138)
http://mevius.5ch.net/test/read.cgi/tech/1535353320/
C++相談室 part139
https://mevius.5ch.net/test/read.cgi/tech/1538755188/
C++相談室 part140
https://mevius.5ch.net/test/read.cgi/tech/1547326582/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.103【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1530384293/
■長いソースを貼るときはここへ。■
http://codepad.org/
https://ideone.com/
[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
----- テンプレ ここまで -----
-
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
探検
C++相談室 part141
■ このスレッドは過去ログ倉庫に格納されています
2019/02/22(金) 03:07:43.52ID:MgOIx7iK
7672
2019/02/28(木) 13:07:02.05ID:g9ECmttI7774
2019/02/28(木) 15:32:45.18ID:nAsBylgf 自分で書いといてアレだけど、
C++に含まれるCの標準関数ってどうなってるんだろ?
Cの規格に追従して自動的に更新されてくのか、
ある時点で分裂したら再統合されるまで離れる一方なのか。
後者だとしたら、C99以降でprintf()の%lfが正当になったとしても
C++に関してはどのバージョンでも未定義、って危険があるな。
C++に含まれるCの標準関数ってどうなってるんだろ?
Cの規格に追従して自動的に更新されてくのか、
ある時点で分裂したら再統合されるまで離れる一方なのか。
後者だとしたら、C99以降でprintf()の%lfが正当になったとしても
C++に関してはどのバージョンでも未定義、って危険があるな。
78はちみつ餃子 ◆8X2XSCHEME
2019/02/28(木) 16:24:48.52ID:KlP/6TOW >>77
今のところつかず離れずを維持してる。
C++ 中の C 関数は「この C 規格を参照」という感じで明記しているので、
ある程度になると状況を見て参照先を変更するってだけ。
まあ関数についてはそれでいいとして、
その他のところも記法は統一して欲しいよなぁ。
C の _Noreturn と C++ の [[noreturn]] はどっちかに統一するのじゃ駄目だったんかなぁ? とか。
今のところつかず離れずを維持してる。
C++ 中の C 関数は「この C 規格を参照」という感じで明記しているので、
ある程度になると状況を見て参照先を変更するってだけ。
まあ関数についてはそれでいいとして、
その他のところも記法は統一して欲しいよなぁ。
C の _Noreturn と C++ の [[noreturn]] はどっちかに統一するのじゃ駄目だったんかなぁ? とか。
2019/02/28(木) 17:54:53.03ID:zeNaE6xz
vector<object*> v
がありまして、んでobjectクラスはメンバ変数int numを持ってるとします
このときですねv.at(1)->num, v.at(2)->num,....v.at(n)->numでvをsortしたいなーってのがあるんですけど上手い方法無いもんでしょうか
全然思いつかなくて
がありまして、んでobjectクラスはメンバ変数int numを持ってるとします
このときですねv.at(1)->num, v.at(2)->num,....v.at(n)->numでvをsortしたいなーってのがあるんですけど上手い方法無いもんでしょうか
全然思いつかなくて
2019/02/28(木) 18:01:05.88ID:3CdGs56r
>>78
そう言うのは好みだからどっちかが大人になって折れるかよほど力の差があるとかでないと統合は無理
そう言うのは好みだからどっちかが大人になって折れるかよほど力の差があるとかでないと統合は無理
2019/02/28(木) 18:07:46.80ID:zeNaE6xz
>>79ですが解決しました。失礼しました。
https://stackoverflow.com/questions/16366978/stdsort-on-a-vector-of-class-pointers
こちらですね
https://stackoverflow.com/questions/16366978/stdsort-on-a-vector-of-class-pointers
こちらですね
82デフォルトの名無しさん
2019/02/28(木) 18:41:06.34ID:IByT54N8 英語だ!!!
>>61
確か double に対応する書式指定は "%f" であって "%lf" ではない、という記憶がありますが
確か double に対応する書式指定は "%f" であって "%lf" ではない、という記憶がありますが
2019/02/28(木) 20:22:30.93ID:SJVUajxC
K&Rのfloatは引数にするとdoubleに昇格するというルールが残っているのでしょう
2019/02/28(木) 23:35:18.37ID:IM+bn+eP
本質ではなく、どうでもいいところにしか突っ込めないんだなw
2019/02/28(木) 23:37:27.00ID:ufQTgCzR
プロトタイプ宣言されたfloat引数にはfloatで渡すけど
可変引数にはfloatは渡せないままなんだな何故か
可変引数にはfloatは渡せないままなんだな何故か
2019/02/28(木) 23:45:49.79ID:SJVUajxC
>>86
va_list にそんな制限あったっけ?
va_list にそんな制限あったっけ?
2019/02/28(木) 23:51:53.97ID:LhFhdmbG
可変長引数関連はスタック周りを弄るコードを「マクロで」wrapしたものだから
C言語と互換性を持たせるためには仕様の詳細まで引き継ぐしか致し方なかったんじゃないの知らんけど
C++専用のva_listを名前を変えて作ったら解決したかもしれんが
知らんけど
ただしそうしたとしたら、extern "C"したのにC言語から呼ばれへん
何で!?となってプチ大混乱が生じそう
知らんけどな…
C言語と互換性を持たせるためには仕様の詳細まで引き継ぐしか致し方なかったんじゃないの知らんけど
C++専用のva_listを名前を変えて作ったら解決したかもしれんが
知らんけど
ただしそうしたとしたら、extern "C"したのにC言語から呼ばれへん
何で!?となってプチ大混乱が生じそう
知らんけどな…
2019/02/28(木) 23:53:46.30ID:LhFhdmbG
printf()ではdoubleを出力できるのに、
scanf()ではfloatしか受け取れない(doubleをスキャンする機能が無い)というのは
C言語の七不思議のうちの一つ
scanf()ではfloatしか受け取れない(doubleをスキャンする機能が無い)というのは
C言語の七不思議のうちの一つ
2019/02/28(木) 23:56:03.03ID:SJVUajxC
MSDNの関連記事 読んでない
https://msdn.microsoft.com/ja-jp/magazine/dn913181.aspx
https://msdn.microsoft.com/ja-jp/magazine/dn913181.aspx
2019/03/01(金) 00:15:41.73ID:fP7U0W+N
しかしさすがにscanf()でdoubleをスキャンできるようにする近代化は一筋縄ではいかなさげ
92デフォルトの名無しさん
2019/03/01(金) 13:14:40.93ID:ozM8zBQ9 >>89
えっ
えっ
2019/03/01(金) 19:20:57.20ID:HVxvwZsK
>>84
不定長引数関数ならば、という縛りがつきます
不定長引数関数ならば、という縛りがつきます
2019/03/01(金) 19:21:39.88ID:HVxvwZsK
>>91
普通に書式"%lf" でできるのではないですか?
普通に書式"%lf" でできるのではないですか?
2019/03/01(金) 19:33:29.87ID:WfqePbUu
>>89
それ何処の世界のC言語の話?
それ何処の世界のC言語の話?
2019/03/01(金) 20:08:46.93ID:WfqePbUu
>>87
規格に書いてあるよ
規格に書いてあるよ
97デフォルトの名無しさん
2019/03/02(土) 10:59:08.67ID:+L4gK20K 出鱈目ばっかり書き込むスレですか?
2019/03/02(土) 11:55:35.34ID:0O78HlO0
2019/03/02(土) 12:04:22.76ID:0O78HlO0
ところで質問なのですが代入やコピー構築時に所有権を移動するクラスFooを造りたいのですが、
Foo::Foo(Foo& rhs) : m_p(rhs.m_p) { rhs.m_p = NULL; } // 引数が非constのコピコン
Foo& Foo::operator=(Foo& rhs) { m_p = rhs.m_p; rhs.m_p = NULL; return *this; } // 引数が非constの代入演算子
を定義して、VS2010とかで警告レベルを4に引き上げると
C4239TypeからType&への変換です
という警告が出るのです
これはFooのムーブコンストラクタを定義したら直るので初めてムーブコンストラクタを定義したいのですが、そこで質問
Q1. ムーブコンストラクタにおいてはコピーされる側の変更はマジで不要?
つまり、所有権移動が絡む今回のFooの場合でも次の書き方でおk?
Foo::Foo(const Foo&& rhs) : m_p(rhs.m_p) { }
Q2. ムーブコンストラクタにおいてコピーされる側を変更しても(実行効率以外は)無害?
つまり、所有権移動が絡む今回のFooの場合でコピコンにならって次の書き方をしても安全?
Foo::Foo(Foo&& rhs) : m_p(rhs.m_p) { rhs.m_p = NULL; }
Foo::Foo(Foo& rhs) : m_p(rhs.m_p) { rhs.m_p = NULL; } // 引数が非constのコピコン
Foo& Foo::operator=(Foo& rhs) { m_p = rhs.m_p; rhs.m_p = NULL; return *this; } // 引数が非constの代入演算子
を定義して、VS2010とかで警告レベルを4に引き上げると
C4239TypeからType&への変換です
という警告が出るのです
これはFooのムーブコンストラクタを定義したら直るので初めてムーブコンストラクタを定義したいのですが、そこで質問
Q1. ムーブコンストラクタにおいてはコピーされる側の変更はマジで不要?
つまり、所有権移動が絡む今回のFooの場合でも次の書き方でおk?
Foo::Foo(const Foo&& rhs) : m_p(rhs.m_p) { }
Q2. ムーブコンストラクタにおいてコピーされる側を変更しても(実行効率以外は)無害?
つまり、所有権移動が絡む今回のFooの場合でコピコンにならって次の書き方をしても安全?
Foo::Foo(Foo&& rhs) : m_p(rhs.m_p) { rhs.m_p = NULL; }
100デフォルトの名無しさん
2019/03/02(土) 12:09:49.85ID:0O78HlO0101デフォルトの名無しさん
2019/03/02(土) 12:23:27.09ID:LLfR4tsY rhsにNULL入れてるってことはrhsのデストラクタで解放されたら困るってことでしょ
一時オブジェクトだろうが何だろうが破棄されるときにデストラクタは走るから、
その例だとNULL入れる必要はある
というかその例は綺麗にムーブを使うべき例
一時オブジェクトだろうが何だろうが破棄されるときにデストラクタは走るから、
その例だとNULL入れる必要はある
というかその例は綺麗にムーブを使うべき例
102デフォルトの名無しさん
2019/03/02(土) 12:37:35.01ID:0O78HlO0 >>101
>rhsにNULL入れてるってことはrhsのデストラクタで解放されたら困るってことでしょ
なるほど確かに…
ていうか鋭い
>というかその例は綺麗にムーブを使うべき例
ホンマや(゚Д゚;)ムーブコンストラだけで動いたわdクス、
>rhsにNULL入れてるってことはrhsのデストラクタで解放されたら困るってことでしょ
なるほど確かに…
ていうか鋭い
>というかその例は綺麗にムーブを使うべき例
ホンマや(゚Д゚;)ムーブコンストラだけで動いたわdクス、
103デフォルトの名無しさん
2019/03/02(土) 12:51:51.79ID:0O78HlO0104デフォルトの名無しさん
2019/03/02(土) 14:47:21.97ID:66qf4QbX えw
実験するのめんどくさいから質問してたわw
ダメだったんだ、ごめんなさい。
実験するのめんどくさいから質問してたわw
ダメだったんだ、ごめんなさい。
105デフォルトの名無しさん
2019/03/02(土) 15:15:55.45ID:oy0Ht86m コンパイルエラーがとれなくて困ってます
■ ヘッダー側
template<class T>
class Test
{
public:
Test(void (*func)(T)) {}
Test(void (*func)(const T&)) {}
};
typedef Test<int *> TestPtr; // テンプレート引数がポインタ型
■ 呼び出し側
static void func1(int *x) {}
static void func2(const int *x) {}
void main()
{
TestPtr test1(func1); // OK
TestPtr test2(func2); // コンパイルエラー
}
VC2008だと以下のエラーになります。
1 番目の引数を 'void (__cdecl *)(const int *)' から 'void (__cdecl *)(T)' に変換できません。
func2みたいにconst付けるとなんでダメなんでしょうか?
■ ヘッダー側
template<class T>
class Test
{
public:
Test(void (*func)(T)) {}
Test(void (*func)(const T&)) {}
};
typedef Test<int *> TestPtr; // テンプレート引数がポインタ型
■ 呼び出し側
static void func1(int *x) {}
static void func2(const int *x) {}
void main()
{
TestPtr test1(func1); // OK
TestPtr test2(func2); // コンパイルエラー
}
VC2008だと以下のエラーになります。
1 番目の引数を 'void (__cdecl *)(const int *)' から 'void (__cdecl *)(T)' に変換できません。
func2みたいにconst付けるとなんでダメなんでしょうか?
106デフォルトの名無しさん
2019/03/02(土) 15:52:41.75ID:0ZOGECoI107デフォルトの名無しさん
2019/03/02(土) 15:54:45.54ID:uEwpVDqh VC++でmsado15.dllをインポートしようとしても参照されずエラーになるのですが原因は何でしょうか?
108デフォルトの名無しさん
2019/03/02(土) 16:25:34.65ID:gxSP/QDn >>107
それだけでわかるか。エラー内容くらい書け
それだけでわかるか。エラー内容くらい書け
109デフォルトの名無しさん
2019/03/02(土) 16:41:21.42ID:uEwpVDqh >>108
C:\Program Files\Common Files\system\ado\msado15.dll に対応するエディターはありません。
このファイルの種類(.dll)のアプリケーションがインストールされていることを確認してください。
重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラー (アクティブ) E1696 ソース ファイルを開けません "C:/Users/owner/Documents/Visual Studio 2017/Projects/20190227/20190227/Debug/msado15.tlh" 20190227 C:\Users\owner\Documents\Visual Studio 2017\Projects\20190227\20190227\Source.cpp 6
ソースは以下の通り
#include <stdio.h>
#include <tchar.h>
#if (WINVER >= 0x0601) // Windows 7 以降
#import "msado60.tlb" no_namespace rename("EOF", "adoEOF")
#else
#import "C:\Program Files\Common Files\system\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")
#endif
C:\Program Files\Common Files\system\ado\msado15.dll に対応するエディターはありません。
このファイルの種類(.dll)のアプリケーションがインストールされていることを確認してください。
重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラー (アクティブ) E1696 ソース ファイルを開けません "C:/Users/owner/Documents/Visual Studio 2017/Projects/20190227/20190227/Debug/msado15.tlh" 20190227 C:\Users\owner\Documents\Visual Studio 2017\Projects\20190227\20190227\Source.cpp 6
ソースは以下の通り
#include <stdio.h>
#include <tchar.h>
#if (WINVER >= 0x0601) // Windows 7 以降
#import "msado60.tlb" no_namespace rename("EOF", "adoEOF")
#else
#import "C:\Program Files\Common Files\system\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")
#endif
110デフォルトの名無しさん
2019/03/02(土) 17:30:18.82ID:oy0Ht86m111デフォルトの名無しさん
2019/03/02(土) 18:12:08.54ID:uEwpVDqh >>109
必要かどうかわからなかったのですが
regsvr32.exeでmsado15.dllを登録
その後いろいろいじってビルドしてみるとコンパイルできました。
ただし出力ができませんでしたがコンパイルはできたのでとりあえず良しとします。
msado15.dllのようなDLLはC(VC)++で扱うのは難しいですね。
インテリセンスが働きませんから…
必要かどうかわからなかったのですが
regsvr32.exeでmsado15.dllを登録
その後いろいろいじってビルドしてみるとコンパイルできました。
ただし出力ができませんでしたがコンパイルはできたのでとりあえず良しとします。
msado15.dllのようなDLLはC(VC)++で扱うのは難しいですね。
インテリセンスが働きませんから…
112デフォルトの名無しさん
2019/03/02(土) 18:48:27.86ID:Gk4CLPf8 「c++ import dll」で検索!
113デフォルトの名無しさん
2019/03/02(土) 20:32:59.25ID:YCnAoXOq マクロは名前空間無いからな
114デフォルトの名無しさん
2019/03/02(土) 22:58:26.16ID:9ABljqhX はじめまして。
C++でスケジューラのようなものを作りたいのですが、
相談に乗っていただけますでしょうか?
C++/MFCのMDIを使用して、ウィンドウ内に複数のウィンドウを配置したいと思っています。
一つのウィンドウにはリスト形式でタスクの一覧を、別のウィンドウでは
ガントチャート形式でタスクの時間ごとにグラフを描画し、その他のウィンドウは各情報を表示出来ればと思っています。
そこで、上記のようなものを作るにあたって、
タスク一覧のウィンドウとガントチャートのウィンドウへドラッグ&ドロップで行き来したいのですが、
そもそもそのような事は可能でしょうか?
また、チャートの描画をするにあたって、グラフは2Dで描画しようと思っているのですが、
2Dのグラフィックライブラリ等を利用した方が簡単に実装出来るでしょうか?
もし良いライブラリ等があればご教示いたければ幸いです。
私自身、開発言語はC++かC#しかまともに使用した経験がないのですが、
実行環境のスペックがあまり高いものを準備出来ないので、
Core2Duo/メモリ2G程度、良くても型落ちのi3程度で、
実行速度も考慮したくC++を選択した次第です。
もし最適な言語や、開発手法があれば教えていただけると嬉しいです。
無知な部分が多いと思いますが、皆さんの意見をお聞かせ頂ければと思いますので、よろしくお願いいたします。
C++でスケジューラのようなものを作りたいのですが、
相談に乗っていただけますでしょうか?
C++/MFCのMDIを使用して、ウィンドウ内に複数のウィンドウを配置したいと思っています。
一つのウィンドウにはリスト形式でタスクの一覧を、別のウィンドウでは
ガントチャート形式でタスクの時間ごとにグラフを描画し、その他のウィンドウは各情報を表示出来ればと思っています。
そこで、上記のようなものを作るにあたって、
タスク一覧のウィンドウとガントチャートのウィンドウへドラッグ&ドロップで行き来したいのですが、
そもそもそのような事は可能でしょうか?
また、チャートの描画をするにあたって、グラフは2Dで描画しようと思っているのですが、
2Dのグラフィックライブラリ等を利用した方が簡単に実装出来るでしょうか?
もし良いライブラリ等があればご教示いたければ幸いです。
私自身、開発言語はC++かC#しかまともに使用した経験がないのですが、
実行環境のスペックがあまり高いものを準備出来ないので、
Core2Duo/メモリ2G程度、良くても型落ちのi3程度で、
実行速度も考慮したくC++を選択した次第です。
もし最適な言語や、開発手法があれば教えていただけると嬉しいです。
無知な部分が多いと思いますが、皆さんの意見をお聞かせ頂ければと思いますので、よろしくお願いいたします。
115さまよえる蟻人間 ◆T6xkBnTXz7B0
2019/03/02(土) 23:07:26.95ID:HH5zv832 それなら、OLE D&Dを実装することになる。具体的には、IDataObject, IDataSource, IDropTargetインターフェースの実装。
116デフォルトの名無しさん
2019/03/02(土) 23:32:17.29ID:4PbQivqk c++でテンプレ使って実装を別ファイルで隠す場合、
// h //////////////////////////////////////////////////
template<typename T> class cls
{
public:
template<typename U> U func();
private:
T var = 0;
};
// cpp1 //////////////////////////////////////////////////
template<> template<> char cls<char>::func<char> { return var; }
template<> template<> int cls<char>::func<int> { return var; }
template<> template<> char cls<int>::func<char> { return var; }
template<> template<> int cls<int>::func<int> { return var; }
// cpp2 //////////////////////////////////////////////////
template<typename T> template<> char cls<T>::func<char>(){ return var; }
template<typename T> template<> int cls<T>::func<int>(){ return var; }
template<> class cls<char>;
template<> class cls<int>;
//////////////////////////////////////////////////
cpp1みたいに全部型指定していく場合はビルド出来るんだけど、
cpp2みたいに別けて型指定していくと出来ない。
cpp2みたいな事を実現可能な方法って無いですかね?
そもそも書き方が間違ってる?
// h //////////////////////////////////////////////////
template<typename T> class cls
{
public:
template<typename U> U func();
private:
T var = 0;
};
// cpp1 //////////////////////////////////////////////////
template<> template<> char cls<char>::func<char> { return var; }
template<> template<> int cls<char>::func<int> { return var; }
template<> template<> char cls<int>::func<char> { return var; }
template<> template<> int cls<int>::func<int> { return var; }
// cpp2 //////////////////////////////////////////////////
template<typename T> template<> char cls<T>::func<char>(){ return var; }
template<typename T> template<> int cls<T>::func<int>(){ return var; }
template<> class cls<char>;
template<> class cls<int>;
//////////////////////////////////////////////////
cpp1みたいに全部型指定していく場合はビルド出来るんだけど、
cpp2みたいに別けて型指定していくと出来ない。
cpp2みたいな事を実現可能な方法って無いですかね?
そもそも書き方が間違ってる?
117さまよえる蟻人間 ◆T6xkBnTXz7B0
2019/03/02(土) 23:37:15.79ID:HH5zv832 ヘッダーで特殊化の方法を指定しないといかんとちゃう? 知らんけど。
118デフォルトの名無しさん
2019/03/02(土) 23:45:00.12ID:0O78HlO0 cls::func()の定義を
U cls::func()
ではなしに、
void cls::func(U& x)
とかにすればおkなキモス、
なおそうするとテンプレートの特殊化以前に関数のオーバーロードで解決できてしまうヨカン、
void cls::func(char& x) { x = (char)var; }
void cls::func(int& x) { x = (int)var; }
void cls::func(double& x) { x = (double)var; }
void cls::func(std::string& x) { x = std::string(var, '0'); }
...
いくらでも作れる……!
U cls::func()
ではなしに、
void cls::func(U& x)
とかにすればおkなキモス、
なおそうするとテンプレートの特殊化以前に関数のオーバーロードで解決できてしまうヨカン、
void cls::func(char& x) { x = (char)var; }
void cls::func(int& x) { x = (int)var; }
void cls::func(double& x) { x = (double)var; }
void cls::func(std::string& x) { x = std::string(var, '0'); }
...
いくらでも作れる……!
119さまよえる蟻人間 ◆T6xkBnTXz7B0
2019/03/02(土) 23:54:10.30ID:HH5zv832 IDataSourceじゃなくてIDropSourceだ。ごめんを。
120デフォルトの名無しさん
2019/03/02(土) 23:59:54.93ID:4PbQivqk121さまよえる蟻人間 ◆T6xkBnTXz7B0
2019/03/03(日) 00:04:53.16ID:KlFuUPR7 特殊化を知らない?
122デフォルトの名無しさん
2019/03/03(日) 00:12:10.08ID:ET38y2ec cpp2の翻訳単位内で完全に実体化させないとどうやっても外からはよべないので
少なくともcpp2の中ではそのように書かないといけないと思う
少なくともcpp2の中ではそのように書かないといけないと思う
123デフォルトの名無しさん
2019/03/03(日) 00:24:16.88ID:kd4WdA4I 確実にcppに実体作りたきゃ明示的インスタンス化は個別にしなきゃ駄目だろ
124デフォルトの名無しさん
2019/03/03(日) 00:24:32.19ID:1zX/ygG4 >>121
この場合の特殊化は、どのような記述になるのでしょうか?
>>122
なるほど、やっぱり無理なんですかね?
これ、元となっているのは、
// h /////////////////////////////////////////////////
template<typename T> class cls
{
public:
int func();
private:
T var;
};
// cpp ////////////////////////////////////////////////////
template<typename T> int cls<T>::func(){ return var; }
template class cls<char>;
/////////////////////////////////////////////////////////////
みたいな感じで func() に戻り値の型指定を追加したいな、
って事でやりはじめたんですよね。
綺麗に書くのが無理そうならば、必要な物を全部書いていきます、、、
この場合の特殊化は、どのような記述になるのでしょうか?
>>122
なるほど、やっぱり無理なんですかね?
これ、元となっているのは、
// h /////////////////////////////////////////////////
template<typename T> class cls
{
public:
int func();
private:
T var;
};
// cpp ////////////////////////////////////////////////////
template<typename T> int cls<T>::func(){ return var; }
template class cls<char>;
/////////////////////////////////////////////////////////////
みたいな感じで func() に戻り値の型指定を追加したいな、
って事でやりはじめたんですよね。
綺麗に書くのが無理そうならば、必要な物を全部書いていきます、、、
125デフォルトの名無しさん
2019/03/03(日) 00:30:05.53ID:AQaNwhGs 要求仕様がいまいちよくわかっていないが(マテ
(1) 任意の型Tの値cls::varから任意の型Uの値を得たい(一種のconverterクラスを作りたい)
(2) 変換関数cls::func()の実装は隠蔽したい
ということならこんなんでど(ry
ttps://ideone.com/1Fh8sg
(1) 任意の型Tの値cls::varから任意の型Uの値を得たい(一種のconverterクラスを作りたい)
(2) 変換関数cls::func()の実装は隠蔽したい
ということならこんなんでど(ry
ttps://ideone.com/1Fh8sg
126デフォルトの名無しさん
2019/03/03(日) 00:38:22.33ID:1zX/ygG4127デフォルトの名無しさん
2019/03/03(日) 00:49:52.61ID:AQaNwhGs >func() の戻り値をテンプレ使用でなんとかする方法が無いのかな、と
func()の戻り値をテンプレにしつつ実装は「完全に」隠蔽したい(ヘッダファイルに書くわけにいかない)となると
やっぱコアとなる変換関数は、必要なTとUの全組み合わせについて「完全に」「非テンプレートで」書かないといけない希ガス
(なぜなら、テンプレートのままcppに書いたら他のcppから呼べない(現行コンパイラはテンプレートの分割コンパイルに対応していない
(2)の隠蔽の要求を多少緩和して、template<class U> void conv(int src, U& dst) { ... } を
ヘッダファイルに書いても良いということならUを返すcls::func()をconv()を1個書いたらできるようにはなる
※ 個人の感想です
※ コードには個人差があります
func()の戻り値をテンプレにしつつ実装は「完全に」隠蔽したい(ヘッダファイルに書くわけにいかない)となると
やっぱコアとなる変換関数は、必要なTとUの全組み合わせについて「完全に」「非テンプレートで」書かないといけない希ガス
(なぜなら、テンプレートのままcppに書いたら他のcppから呼べない(現行コンパイラはテンプレートの分割コンパイルに対応していない
(2)の隠蔽の要求を多少緩和して、template<class U> void conv(int src, U& dst) { ... } を
ヘッダファイルに書いても良いということならUを返すcls::func()をconv()を1個書いたらできるようにはなる
※ 個人の感想です
※ コードには個人差があります
128デフォルトの名無しさん
2019/03/03(日) 00:57:11.45ID:1zX/ygG4129デフォルトの名無しさん
2019/03/03(日) 01:15:53.21ID:AQaNwhGs スマン>>127は言い過ぎたかもしれん…
全組み合わせをcppに書く作業をそのcppの中でテンプレートを定義して省力化することは可能かもしれん
ただし、そのcppの中で定義したのと同じシグネチャ(名前+引数)でユーザーコードが別のテンプレート関数を定義でもしたら、
ODRに違反することになる(この場合実際に変な挙動になる危険性が大きい)ので全体を無名namespaceで囲う必要がありそう
無名namespaceの中から選択的に関数をエクスポートできるのかは正直知らん
あんまりテンプレート絡みで無茶はやりたくナサス
全組み合わせをcppに書く作業をそのcppの中でテンプレートを定義して省力化することは可能かもしれん
ただし、そのcppの中で定義したのと同じシグネチャ(名前+引数)でユーザーコードが別のテンプレート関数を定義でもしたら、
ODRに違反することになる(この場合実際に変な挙動になる危険性が大きい)ので全体を無名namespaceで囲う必要がありそう
無名namespaceの中から選択的に関数をエクスポートできるのかは正直知らん
あんまりテンプレート絡みで無茶はやりたくナサス
130デフォルトの名無しさん
2019/03/03(日) 01:30:06.83ID:kd4WdA4I 定義は共通でして
template int cls<char>::func<int>();
みたいなのを使う分だけ書けば良い
ただ、今回の場合クラス内テンプレート関数の特殊化しようとすると怒られるからさらに工夫が必要
template int cls<char>::func<int>();
みたいなのを使う分だけ書けば良い
ただ、今回の場合クラス内テンプレート関数の特殊化しようとすると怒られるからさらに工夫が必要
131デフォルトの名無しさん
2019/03/03(日) 01:33:24.30ID:ET38y2ec ああ、確かに
使わない関数テンプレートをcppで定義してそれの明示的インスタンス化を通してやれば省力化できそう
この場合その使わない関数テンプレートを内部リンケージにしても、その中で実体化要求されたテンプレートのリンケージには影響はないはず
使わない関数テンプレートをcppで定義してそれの明示的インスタンス化を通してやれば省力化できそう
この場合その使わない関数テンプレートを内部リンケージにしても、その中で実体化要求されたテンプレートのリンケージには影響はないはず
132デフォルトの名無しさん
2019/03/03(日) 02:24:28.96ID:5EsDLzeQ Visual Studioで通ってもgccで通らなかったりするからテンプレートの実体化は厄介。
133デフォルトの名無しさん
2019/03/03(日) 02:47:42.46ID:dVINV85+ もはやコンパイラありきの言語
134デフォルトの名無しさん
2019/03/03(日) 02:53:02.86ID:kd4WdA4I VC++がC++擬きの別言語なだけだろ
今ごろになってやっと2 phase lookup対応させた
structとclassが違うとリンクでこけるのも糞
今ごろになってやっと2 phase lookup対応させた
structとclassが違うとリンクでこけるのも糞
135デフォルトの名無しさん
2019/03/03(日) 03:13:19.05ID:ET38y2ec VS2017以降のMSVCは許してあげてほしい・・・
136デフォルトの名無しさん
2019/03/03(日) 05:50:17.03ID:EorZPwcP えっ、何か革新的なことをしているの?
C++は今までつかったことがなかったんだが、最近マイコンの開発に使ってから
かなり気に入っている。これならPCでも使えるかもと今考えているところ。
C++は今までつかったことがなかったんだが、最近マイコンの開発に使ってから
かなり気に入っている。これならPCでも使えるかもと今考えているところ。
137デフォルトの名無しさん
2019/03/03(日) 06:33:00.88ID:ChZC+e8W 組み込み用途だとC++よりCの方が融通効くと思うんだが
最近の組み込みはひょっとして随分恵まれてるのか
最近の組み込みはひょっとして随分恵まれてるのか
138デフォルトの名無しさん
2019/03/03(日) 07:57:12.43ID:EUJr/Yte ふと思ったんですが、Java でデコレーターを記述するのに
BufferedReader br = new BufferedReader(new InpustStreamReader(System.in));
などと、new したオブジェクトのポインタを取っておかず、new したまま放置してしまう書き方がありますが、
スコープ内で new したオブジェクトは、スコープを外れるときに C++翻訳系が自分で delete する、と決め打ちしてしまうと、互換性で問題がでるでしょうか?
BufferedReader br = new BufferedReader(new InpustStreamReader(System.in));
などと、new したオブジェクトのポインタを取っておかず、new したまま放置してしまう書き方がありますが、
スコープ内で new したオブジェクトは、スコープを外れるときに C++翻訳系が自分で delete する、と決め打ちしてしまうと、互換性で問題がでるでしょうか?
140デフォルトの名無しさん
2019/03/03(日) 10:18:54.68ID:0vjeZZiI そのポインタを別の場所にコピーしてたらどうなる?
頭悪すぎだろ
頭悪すぎだろ
>>140
では、あからさまに new したポインタを捨ててしまっている記述に限り自動で delete する、というのはどうですか?
目的は…classpath を共用したいのです、classpath はあらたに c++ で書くとして
では、あからさまに new したポインタを捨ててしまっている記述に限り自動で delete する、というのはどうですか?
目的は…classpath を共用したいのです、classpath はあらたに c++ で書くとして
142デフォルトの名無しさん
2019/03/03(日) 10:26:03.14ID:0vjeZZiI143デフォルトの名無しさん
2019/03/03(日) 10:31:40.12ID:8Bef4COm よくわかんねえけど楽してJavaを移植したいってこと?
Boehm GCでも使ってみたらどうだ
Boehm GCでも使ってみたらどうだ
145デフォルトの名無しさん
2019/03/03(日) 10:35:19.96ID:oO/57lY2 make_uniqueがやりたいってことかね
>>142
内容を誤解していました、すみません
あらためて回答します
プログラマが new したポインタ値を変数に取っておく記述をした場合は、delete の責任はプログラマにあるものとし、処理系では何もしないものとします
内容を誤解していました、すみません
あらためて回答します
プログラマが new したポインタ値を変数に取っておく記述をした場合は、delete の責任はプログラマにあるものとし、処理系では何もしないものとします
148デフォルトの名無しさん
2019/03/03(日) 10:53:36.82ID:rOejoJLo149デフォルトの名無しさん
2019/03/03(日) 10:59:02.77ID:kd4WdA4I javaでnewしているからってc++でnewするなって
classpath共用が何を意味しているのかは分からんが
classpath共用が何を意味しているのかは分からんが
150デフォルトの名無しさん
2019/03/03(日) 11:02:05.72ID:AQaNwhGs ・繰り返し構文とgotoの全廃
151デフォルトの名無しさん
2019/03/03(日) 11:24:20.63ID:0vjeZZiI152デフォルトの名無しさん
2019/03/03(日) 11:44:43.82ID:lodoh91K >>151
んんー、それは c++ 的な扱い(delete はプログラマの責任)でいいかと、私の思考に何が抜けているのかな?もう少し考えて見ます
んんー、それは c++ 的な扱い(delete はプログラマの責任)でいいかと、私の思考に何が抜けているのかな?もう少し考えて見ます
154デフォルトの名無しさん
2019/03/03(日) 12:18:50.69ID:kd4WdA4I >>139
規格ではdeleteしないものをdeleteしたら互換性に問題が出る。
自動でdeleteしたかったらスマートポインタ使うべき
独自c++擬き想定しているならc++17使うのも当然okのはず
生のnew使わせるなんて今時のc++ではとんでもない悪手
規格ではdeleteしないものをdeleteしたら互換性に問題が出る。
自動でdeleteしたかったらスマートポインタ使うべき
独自c++擬き想定しているならc++17使うのも当然okのはず
生のnew使わせるなんて今時のc++ではとんでもない悪手
155デフォルトの名無しさん
2019/03/03(日) 13:13:27.54ID:5kJ1RFDr VS2017は十分な出来なんだがテンプレートの展開中に内部エラーで転けることがあってそこだけは不満
156デフォルトの名無しさん
2019/03/03(日) 15:47:18.29ID:5EsDLzeQ shared_ptr でJavaやC#のガーベージ・コレクションとほぼ同じ役目が期待できるから別にいいのでは。
C++は、shared_ptrが正式採用されたC++11で別の言語になった印象すらあるわ。
C++は、shared_ptrが正式採用されたC++11で別の言語になった印象すらあるわ。
157デフォルトの名無しさん
2019/03/03(日) 15:57:24.31ID:8Bef4COm 循環参照が検出できないからJavaプログラムの参照をそのまま置き換えればオッケーというわけでもない
もちろんナマポよりは遥かにマシだけど
もちろんナマポよりは遥かにマシだけど
158デフォルトの名無しさん
2019/03/03(日) 15:59:19.15ID:rOejoJLo >>155
面倒だとは思うけど、時間あるなら再現するコードと共にバグ報告送ってやってくれ
面倒だとは思うけど、時間あるなら再現するコードと共にバグ報告送ってやってくれ
159デフォルトの名無しさん
2019/03/03(日) 16:11:53.27ID:E4UxtVYi unique_ptr<hoge> up0(new hoge());
や
shared_ptr<hoge> sp0(new hoge());
と書いたときと
unique_ptr<hoge> up1 = new hoge();
や
shared_ptr<hoge> sp1 = new hoge();
と書いた時で
違いは生じますか?
生じるとしたらどんな違いですか?
や
shared_ptr<hoge> sp0(new hoge());
と書いたときと
unique_ptr<hoge> up1 = new hoge();
や
shared_ptr<hoge> sp1 = new hoge();
と書いた時で
違いは生じますか?
生じるとしたらどんな違いですか?
160デフォルトの名無しさん
2019/03/03(日) 16:19:53.78ID:D2G4oQ9F 副業解禁で激変する若者世代とマネージャー世代のキャリア観
https://www.businessinsider.jp/post-107782
フリーランスの職種20個の仕事内容と平均年収をわかりやすく解説
https://www.proof0309.com/entry/shokushu
時給1万円のバイトも。会社員向きのプチ副業を、“バイト芸人”が教える
https://headlines.yahoo.co.jp/article?a=20190226-00127948-bizspa-bus_all
副業が「会社にバレる人」と「バレない人」の大差
https://headlines.yahoo.co.jp/article?a=20190303-00268007-toyo-bus_all
正社員の10%以上が副業 中には過重労働で体調崩す人も
https://headlines.yahoo.co.jp/hl?a=20190227-00010000-wordleaf-bus_all
「副業で年2000万円稼ぐ男」に学ぶキャリア戦略
https://headlines.yahoo.co.jp/article?a=20190221-00266856-toyo-bus_all
加速する「副業社会」正社員の4割が「副業したい」 気になる収入はどれくらい?
https://headlines.yahoo.co.jp/hl?a=20190218-00010001-danro-life
おすすめ副業22選を現役フリーランスが解説【在宅も可能】
https://www.proof0309.com/entry/zaitaku-hukugyou
会社を辞めてフリーランスで働きたいあなたが知っておくべき10のこと
https://www.businessinsider.jp/post-165731
フリーランスと会社員、働き方の根本的な差 広がる「雇用されない働き方」の課題とは何か
https://toyokeizai.net/articles/-/263055
フリーランス人口は増える!今後は仕事もプロジェクト単位になる!?
https://freelance.mts-career.com/population/
https://www.businessinsider.jp/post-107782
フリーランスの職種20個の仕事内容と平均年収をわかりやすく解説
https://www.proof0309.com/entry/shokushu
時給1万円のバイトも。会社員向きのプチ副業を、“バイト芸人”が教える
https://headlines.yahoo.co.jp/article?a=20190226-00127948-bizspa-bus_all
副業が「会社にバレる人」と「バレない人」の大差
https://headlines.yahoo.co.jp/article?a=20190303-00268007-toyo-bus_all
正社員の10%以上が副業 中には過重労働で体調崩す人も
https://headlines.yahoo.co.jp/hl?a=20190227-00010000-wordleaf-bus_all
「副業で年2000万円稼ぐ男」に学ぶキャリア戦略
https://headlines.yahoo.co.jp/article?a=20190221-00266856-toyo-bus_all
加速する「副業社会」正社員の4割が「副業したい」 気になる収入はどれくらい?
https://headlines.yahoo.co.jp/hl?a=20190218-00010001-danro-life
おすすめ副業22選を現役フリーランスが解説【在宅も可能】
https://www.proof0309.com/entry/zaitaku-hukugyou
会社を辞めてフリーランスで働きたいあなたが知っておくべき10のこと
https://www.businessinsider.jp/post-165731
フリーランスと会社員、働き方の根本的な差 広がる「雇用されない働き方」の課題とは何か
https://toyokeizai.net/articles/-/263055
フリーランス人口は増える!今後は仕事もプロジェクト単位になる!?
https://freelance.mts-career.com/population/
161デフォルトの名無しさん
2019/03/03(日) 17:35:34.30ID:8Bef4COm162デフォルトの名無しさん
2019/03/03(日) 17:53:40.63ID:E4UxtVYi make_shared使った方が良い?
163デフォルトの名無しさん
2019/03/03(日) 19:22:53.95ID:8Bef4COm うん
164デフォルトの名無しさん
2019/03/04(月) 04:26:14.48ID:FZO2lxM7 new 呼び出しが少なければ少ないほど精神衛生に良い。
165デフォルトの名無しさん
2019/03/04(月) 06:09:53.20ID:eTdHd+Gg 複数の関数の戻り値を足し合わせる処理で、それぞれの関数の戻り値をチェックしたい場合のすっきりする方法は何かありますか?
std::string result;
result += func1(a);
result += func2(b);
result += func3(c);
の各func1,2,3の戻り値をresultに足す前に空でないかを確認したいのです (1つでも空があった場合はresultも空にしたい)
単純に一時変数を用意して一つずつ判定するしかありませんか?
std::string result;
result += func1(a);
result += func2(b);
result += func3(c);
の各func1,2,3の戻り値をresultに足す前に空でないかを確認したいのです (1つでも空があった場合はresultも空にしたい)
単純に一時変数を用意して一つずつ判定するしかありませんか?
166デフォルトの名無しさん
2019/03/04(月) 06:27:48.33ID:iluilBaY typename Iterator::container_type::value_type
こんな風に::で三個つなげるのは合法ですかね??
こんな風に::で三個つなげるのは合法ですかね??
167デフォルトの名無しさん
2019/03/04(月) 06:31:54.66ID:nFXsjzZK エイリアス使えば
168デフォルトの名無しさん
2019/03/04(月) 06:33:10.80ID:7Cz1/mIW funcN() を追加する直前の result.size() を記憶しておいて、
足した後に長さが増えてなかったら、今呼んだ funcN() の結果は空だった、
と判定することはできるか。
string から整数になるだけで、一時変数を使うのは変わらない上に、
処理内容が分かりやすくなるわけでもないけど。
足した後に長さが増えてなかったら、今呼んだ funcN() の結果は空だった、
と判定することはできるか。
string から整数になるだけで、一時変数を使うのは変わらない上に、
処理内容が分かりやすくなるわけでもないけど。
169デフォルトの名無しさん
2019/03/04(月) 07:56:06.21ID:EZgqhZII >>165
例外
例外
170デフォルトの名無しさん
2019/03/04(月) 08:09:41.73ID:t1tsHTRA >>166
合法
合法
171デフォルトの名無しさん
2019/03/04(月) 15:31:21.38ID:V3vkr0fP unique_ptr<int> u(new int[2]{4, 5}); // OK (A) -> int * が作られる u.get()[n] でアクセス可能 *u だめ
unique_ptr<int> u = make_unique<int>(6); // OK -> int * が作られる *u でアクセス可能 u[0] だめ
unique_ptr<int[]> u = make_unique<int[]>(2); // OK (B) -> int [] が作られる u[n] でアクセス可能 *u だめ *u.get() 可能
unique_ptr<int *> u = make_unique<int>(2); // コンパイルエラー (C)
unique_ptr<int *> u = make_unique<int *>(2); // コンパイルエラー (D)
unique_ptr<int *> u(new int *); // ok -> int ** が作られる *u = &hoge あれば **u でアクセス可能
(C)(D)がエラーになる理由と
(B)を(A)の様に同時に初期化したいとき
どう書けば良いか知りたいです
unique_ptr<int> u = make_unique<int>(6); // OK -> int * が作られる *u でアクセス可能 u[0] だめ
unique_ptr<int[]> u = make_unique<int[]>(2); // OK (B) -> int [] が作られる u[n] でアクセス可能 *u だめ *u.get() 可能
unique_ptr<int *> u = make_unique<int>(2); // コンパイルエラー (C)
unique_ptr<int *> u = make_unique<int *>(2); // コンパイルエラー (D)
unique_ptr<int *> u(new int *); // ok -> int ** が作られる *u = &hoge あれば **u でアクセス可能
(C)(D)がエラーになる理由と
(B)を(A)の様に同時に初期化したいとき
どう書けば良いか知りたいです
172デフォルトの名無しさん
2019/03/04(月) 17:39:35.24ID:rgTuscQv C 型が違う
D int*が2から作れない
D int*が2から作れない
173デフォルトの名無しさん
2019/03/04(月) 19:03:47.51ID:iluilBaY >>170
どうもありがとう。
どうもありがとう。
174165
2019/03/04(月) 22:26:16.82ID:eTdHd+Gg175デフォルトの名無しさん
2019/03/04(月) 23:05:47.73ID:IrD+1pkV void f()
{
static std::mutex mtx;
std::lock_guard<std::mutex> lock(mtx);
//何がしかの処理
}
これっていいの?
{
static std::mutex mtx;
std::lock_guard<std::mutex> lock(mtx);
//何がしかの処理
}
これっていいの?
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【おこめ券】鈴木農相 米価維持の意図「一切ない」 [ぐれ★]
- 【警視庁】走行中の電車で女性に露出した下半身押しつけたか 無職の男(46)逮捕「チャンスがあればいつでもやる」 [nita★]
- バリ島で男子生徒ら集団万引きか、防犯カメラ映像が拡散 京都の大谷中学・高校が「窃盗行為」謝罪★6 [七波羅探題★]
- 【苺ましまろ】立民衆院議員、人気漫画の水着少女画像を「醜悪」タイ人少女の性搾取事件と関連付け…党内で反発 [少考さん★]
- 「残業キャンセル界隈」若者が増加?「職務放棄」との批判も…“定時退社の権利”どこまで通用するか [七波羅探題★]
- 中国軍機レーダー照射、トランプ氏沈黙突く 試される日本外交 ★5 [蚤の市★]
- 【超速報】統一教会、陳謝 [519511584]
- 【速報】1ポンド210円で日英GDP逆転(残り1.5円)...世界6位の経済規模に転落 [237216734]
- 【実況】博衣こよりのえちえちチーズケーキを仕込み(雑談あり)🧪
- 高市政権「かけてもつながらない。機能していない」防衛当局間のホットライン機能せず [834922174]
- 30過ぎた大人おじさんが大学生(昔)のままのファッションをする「おじさんキッズコーデ」、炎上して問題視される。 [153490809]
- 【高市悲報】中国軍「公海で空母の発着訓練するって事前通告したのになんで自衛隊機は急接近してきたんだ…?」中国軍困惑★2 [931948549]
