[過去ログ] C++相談室 part164 (1002レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
268: (ワッチョイ 8101-1tDD) 2023/06/20(火)22:29 ID:vGfe0Eju0(5/7) AAS
templateが意味ないね
269(4): (ワッチョイ 127f-L1I+) 2023/06/20(火)22:39 ID:ui/rWsWf0(1) AAS
265が言うようにis_invocable使うとこんな感じ?
template<typename Callback>
void func(Callback cb)
{
if constexpr (std::is_invocable_v<Callback, int>) {
cb(1);
} else if constexpr (std::is_invocable_v<Callback, int, int>) {
cb(1,2);
}
}
270(1): (ワッチョイ 8101-1tDD) 2023/06/20(火)22:41 ID:vGfe0Eju0(6/7) AAS
>>269
これって関係ないif節はコンパイル時に消えるの?
271(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) 2023/06/20(火)22:43 ID:IIzrqfbq0(4/5) AAS
>>270
消えるよ。
272(1): (JP 0H91-FhUT) 2023/06/20(火)22:44 ID:Pk8V/jejH(2/4) AAS
>>269
ありがとうございます。
gcc 13.1.0 でc++17でうまくいきました。
後出しで申し訳ありませんが、C++14でかけませんか?
273(1): (ワッチョイ 8101-1tDD) 2023/06/20(火)22:47 ID:vGfe0Eju0(7/7) AAS
>>269,271
これは知らんかった
勉強になるなぁ
274(1): (JP 0H91-FhUT) 2023/06/20(火)22:48 ID:Pk8V/jejH(3/4) AAS
>>269
まさにこれをやりたかったです。
template<typename Callback>
void func(Callback cb)
{
// こことか
if constexpr (std::is_invocable_v<Callback, int>) {
cb(1);
} else if constexpr (std::is_invocable_v<Callback, int, int>) {
cb(1,2);
省3
275(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) 2023/06/20(火)22:59 ID:IIzrqfbq0(5/5) AAS
>>272 >>274
ひとつの関数テンプレート中でやりたいってこと?
if constexpr が導入される前だとオーバーロードなり特殊化なりで
別の関数として分離しないと書けないと思う。
is_invocable に相当するものは自分で書こうと思えば書けるが
if constexpr は言語のコアの機能だからどうにもならんし……。
276: (JP 0H91-FhUT) 2023/06/20(火)23:14 ID:Pk8V/jejH(4/4) AAS
>>275
情報ありがとうございます
ご掲示いただいたコードで勉強になりました。
277: (ワッチョイ 69f0-J7ro) 2023/06/20(火)23:42 ID:zCL4VLm70(1/2) AAS
>>273
ザッツcostexprマジック
278: (ワッチョイ 69f0-J7ro) 2023/06/20(火)23:43 ID:zCL4VLm70(2/2) AAS
n抜けてたwコストがかかる演算なのは確かだけどw
constexprマジック!マジック!
279(2): (ワッチョイ 32fb-dYQK) 2023/06/21(水)00:07 ID:2lh42auf0(1/2) AAS
C++11のSFIANE地獄へようこそ
外部リンク:wandbox.org
template関数の実体化が1つだけ成功して、
他が失敗するように仕掛ければ呼び分けは可能。
ただ見ての通り相当面倒なことを書かなきゃならない。
280(1): (ワッチョイ 8101-1tDD) 2023/06/21(水)00:28 ID:CWKUsltc0(1/3) AAS
>>279
>>266と本質的に何が違うのか分からない
解説よろしく
(templateでやってることは無駄なのでは?)
281(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) 2023/06/21(水)00:41 ID:3HBFHOpK0(1/5) AAS
>>280
いや、 >>279 のほうがちょっと柔軟で使いやすい。
たとえば
void f3(long int, long int) {}
みたいなのを渡したとき >>266 ではエラーになる。
引数として int を渡せる (int から暗黙に変換可能な仮引数を持っている) というのと
厳密に int そのものでなければならないというのとでは制約の厳しさが違う。
282: (ワッチョイ 515f-9XmN) 2023/06/21(水)00:42 ID:LxMKpynY0(1) AAS
templateでやるのは質問者の与えた要件だな
宿題なんじゃね、しらんけど
283(1): (ワッチョイ 32fb-9xvA) 2023/06/21(水)00:52 ID:2lh42auf0(2/2) AAS
C++14にはif constexprが存在しないから
template使ったオーバーロードしか手段がない
質問者がC++14環境でって言ってたからこんなクソ面倒くさいことやれば一応できるっていう例示
284: (ワッチョイ 8101-1tDD) 2023/06/21(水)01:17 ID:CWKUsltc0(2/3) AAS
>>281,283
ありがとう
>引数として int を渡せる (int から暗黙に変換可能な仮引数を持っている) というのと
>厳密に int そのものでなければならないというのとでは制約の厳しさが違う。
こういうことね
285(2): (ワッチョイ a901-UvLK) 2023/06/21(水)04:29 ID:IDPPhD2V0(1/3) AAS
>>260
あー本来グローバルも対象になるのか、適当こいてスマソ
だが>>248で質問者が言ってるように、元のコードで順序を変えてもダメなのよ
何故か考えてはちみつのコードを以下のようにしたら同様に通らなかった
namespace ns {
template <class T = int>
struct foo{};
// added
struct hoge{};
int operator +(const hoge &x, const hoge &y) {return 1;}
省9
286: (ワッチョイ a901-UvLK) 2023/06/21(水)09:44 ID:IDPPhD2V0(2/3) AAS
あ、すまんfooがクラステンプレートになってるの直し忘れた(直しても同じだが)
287: はちみつ餃子◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) 2023/06/21(水)10:22 ID:3HBFHOpK0(2/5) AAS
>>285
名前探索 (name lookup) は狭い名前空間から探索していって
合致する名前があればそれより外側に同名の関数があっても
オーバーロード解決に参加しない。
わかりやすい例で言えばメンバ関数は非メンバより優先されるし、
メンバ関数内にひとつでも候補が見つかった時点で非メンバ関数は一切考慮に入らなくなる。
void foo(void) {}
struct bar {
void baz(void) {
// この foo は bar::foo のこと
省6
上下前次1-新書関写板覧索設栞歴
あと 715 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.015s