質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
87.20%
参照

参照は、プログラミングにおいて変数や関数といったメモリ空間上での所在を指示するデータのことを指します。その中にはデータ自体は含まれず、他の場所にある情報を間接的に指示するプログラムです。

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

解決済

【Rust】ジェネリックな構造体とメソッドの部分特殊化を参照の場合でも使えるようオーバーロードしたい

akira_kano1101
akira_kano1101

総合スコア16

参照

参照は、プログラミングにおいて変数や関数といったメモリ空間上での所在を指示するデータのことを指します。その中にはデータ自体は含まれず、他の場所にある情報を間接的に指示するプログラムです。

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

1回答

0リアクション

0クリップ

479閲覧

投稿2022/04/05 12:27

こんにちは。Rustでソフトウェア開発をしています。

C++でいうテンプレート部分特殊化をRustのコードで実現したいです。

いろんなWebサイトを調べてみました。

しかし問題は解決できません。

forの後の部分(structなど)の部分特殊化についてはいくつか見かけました。ですがforの前部分(trait)の部分特殊化について書かれているところを見つけられませんでした。

問題のコード

rust

use std::sync::{Arc, Mutex}; pub trait TryLockAndThen<T, U> where T: ?Sized, { type Output; fn run<F>(&self, f: F) -> Self::Output where F: FnOnce(&mut T) -> Self::Output; } impl<T, U> TryLockAndThen<T, U> for Arc<Mutex<T>> where T: ?Sized, U: Default, { type Output = U; fn run<F>(&self, f: F) -> Self::Output where F: FnOnce(&mut T) -> Self::Output, { match self.try_lock().as_deref_mut() { Err(_) => { let default = U::default(); return default; } Ok(target) => return f(target), } } } impl<'a, T, U> TryLockAndThen<T, &'a U> for Arc<Mutex<T>> where T: ?Sized, U: Default, { type Output = &'a U; fn run<F>(&self, f: F) -> Self::Output where F: FnOnce(&mut T) -> Self::Output, { match self.try_lock().as_deref_mut() { Err(_) => { let default = U::default(); return &default; } Ok(target) => return f(target), } } }

エラーメッセージ

error[E0119]: conflicting implementations of trait `helper::TryLockAndThen<_, &_>` for type `std::sync::Arc<std::sync::Mutex<_>>` --> interactors/src/helper.rs:32:1 | 13 | / impl<T, U> TryLockAndThen<T, U> for Arc<Mutex<T>> 14 | | where 15 | | T: ?Sized, 16 | | U: Default, ... | 30 | | } 31 | | } | |_- first implementation here 32 | / impl<'a, T, U> TryLockAndThen<T, &'a U> for Arc<Mutex<T>> 33 | | where 34 | | T: ?Sized, 35 | | U: Default, ... | 49 | | } 50 | | } | |_^ conflicting implementation for `std::sync::Arc<std::sync::Mutex<_>>`

runメソッドの戻り値を、U型と&U型の両パターンに同じシグネチャで実現したいだけなのですが…

ご存じの方いらっしゃいましたら恐縮ですが、ご教示いただけますと幸いです。

よろしくお願いいたします。

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

参照

参照は、プログラミングにおいて変数や関数といったメモリ空間上での所在を指示するデータのことを指します。その中にはデータ自体は含まれず、他の場所にある情報を間接的に指示するプログラムです。

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。