C ++のオーバーロードおよびテンプレート化されたファンクターとその引数の完全な転送

OneRaynyDay

次のような関数があるとします。

template <typename F, typename... A>
inline void execute(F&& functor, A&& ... args) {
    std::forward<decltype(functor)>(functor)(std::forward<decltype(args)>(args)...);
}

これは、単純な非テンプレート関数で機能します。ただし、テンプレート化された関数(非常に工夫された関数)を完全に転送しようとしています。

namespace detail {

template <typename CodecImpl>
class codec
{
public:
    //
    // Encoding

    // Convenient version, returns an std::string.
    static std::string encode(const uint8_t* binary, size_t binary_size);
    static std::string encode(const char* binary, size_t binary_size);
    ...
};

class base64_rfc4648
{
public:
    template <typename Codec> using codec_impl = stream_codec<Codec, base64_rfc4648>;

    static CPPCODEC_ALWAYS_INLINE constexpr size_t alphabet_size() {
        static_assert(sizeof(base64_rfc4648_alphabet) == 64, "base64 alphabet must have 64 values");
        return sizeof(base64_rfc4648_alphabet);
    }
    static CPPCODEC_ALWAYS_INLINE constexpr char symbol(alphabet_index_t idx)
    {
        return base64_rfc4648_alphabet[idx];
    }
    ...
};

} // namespace detail

using base64_rfc4648 = detail::codec<detail::base64<detail::base64_rfc4648>>;

上記を転送しようとしています:

std::string buf("hello world");
execute(base64_rfc4648::encode, buf.c_str(), buf.size());

動作しません。テンプレートの推定が失敗する:

注:テンプレートパラメータ「F」を推測できませんでした

そしてそれはまた注意します:

を呼び出すための一致する関数がありません 'execute(<unresolved overloaded function type>, const char*, std::__cxx11::basic_string<char>::size_type)'

どうすればこれを修正できますか?

注:読みやすくするために上記の情報は短くしましたが、さらに情報が必要な場合は追加できます。

user2709407

を使用boost::hofbase64_rfc4648::encodeて、関数オブジェクトをラップすることができます。execute(BOOST_HOF_LIFT(base64_rfc4648::encode), buf.c_str(), buf.size());

これがBOOST_HOF_LIFTのドキュメントです

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

テンプレートのインスタンス化後に宣言されたテンプレート関数ピック候補から呼び出されたC ++テンプレートオーバーロード解決

分類Dev

オーバーロードされたコンストラクターに同じ数の引数を提供するC ++ / CXファクトリクラス

分類Dev

c ++テンプレートとオーバーロードされた関数へのあいまいな呼び出し

分類Dev

C ++テンプレートの特殊化/部分的および完全

分類Dev

C ++のテンプレート引数として完全に指定されていないテンプレート

分類Dev

パブリックおよびプライベートのオーバーロードされたコンストラクターを使用しているときのc ++ガベージメンバー値

分類Dev

C ++の継承、テンプレート、およびオーバーライド

分類Dev

SFINAEを使用したC ++ 11テンプレート関数の特殊化により、さらに特殊化できます(エラー:オーバーロードされた関数の呼び出しがあいまいです)

分類Dev

ネストされた列挙型のテンプレートパラメーターでオーバーロードするC ++フレンド演算子

分類Dev

正確なテンプレート引数でのC ++オーバーロードの競合

分類Dev

テンプレート引数としてのC ++オーバーロード関数

分類Dev

c ++:可変個引数テンプレートと関数のオーバーロード

分類Dev

C ++:テンプレートメンバー関数呼び出しの転送に失敗しました

分類Dev

C ++でのテンプレートの特殊化と関数のオーバーロード

分類Dev

条件演算子を使用しているときにテンプレート化された値または関数を再帰的に計算するときのエラーC1202(スタックオーバーフロー)

分類Dev

パラメーターC ++のタイプによってオーバーロードされたコンストラクターを特殊化します

分類Dev

C ++テンプレート関数-複数のタイプ、デフォルトおよび...引数?

分類Dev

[]および=演算子をオーバーロードして、C ++でテンプレートクラスの値を受け入れる

分類Dev

CおよびC ++コンパイラが、明示的に初期化されたグローバル変数とデフォルトで初期化されたグローバル変数を異なるセグメントに配置するのはなぜですか?

分類Dev

C ++ 14のテンプレート化された関数の引数

分類Dev

C ++エラー:タイプ 'double'および<未解決のオーバーロードされた関数タイプ 'からバイナリ'演算子 'への無効なオペランド

分類Dev

テンプレートクラスのインスタンス化されたオブジェクトのC ++テンプレートメタ関数

分類Dev

C ++関数テンプレートのオーバーロード:空の中括弧と明示的な整数

分類Dev

C ++のオーバーロードされたコンストラクターを介して不明な型の変数を初期化する

分類Dev

C ++のオーバーロードされたコンストラクターを介して不明な型の変数を初期化する

分類Dev

コンストラクターでの完全な転送(C ++ 17)

分類Dev

オーバーロードされた関数のC ++の複数のインスタンスが、ヘッダーファイルの作成時に引数リストと一致します

分類Dev

テンプレート化されたクラスで/演算子をオーバーロードしようとしたC ++エラー

分類Dev

C ++のテンプレートクラスと関数のオーバーロード

Related 関連記事

  1. 1

    テンプレートのインスタンス化後に宣言されたテンプレート関数ピック候補から呼び出されたC ++テンプレートオーバーロード解決

  2. 2

    オーバーロードされたコンストラクターに同じ数の引数を提供するC ++ / CXファクトリクラス

  3. 3

    c ++テンプレートとオーバーロードされた関数へのあいまいな呼び出し

  4. 4

    C ++テンプレートの特殊化/部分的および完全

  5. 5

    C ++のテンプレート引数として完全に指定されていないテンプレート

  6. 6

    パブリックおよびプライベートのオーバーロードされたコンストラクターを使用しているときのc ++ガベージメンバー値

  7. 7

    C ++の継承、テンプレート、およびオーバーライド

  8. 8

    SFINAEを使用したC ++ 11テンプレート関数の特殊化により、さらに特殊化できます(エラー:オーバーロードされた関数の呼び出しがあいまいです)

  9. 9

    ネストされた列挙型のテンプレートパラメーターでオーバーロードするC ++フレンド演算子

  10. 10

    正確なテンプレート引数でのC ++オーバーロードの競合

  11. 11

    テンプレート引数としてのC ++オーバーロード関数

  12. 12

    c ++:可変個引数テンプレートと関数のオーバーロード

  13. 13

    C ++:テンプレートメンバー関数呼び出しの転送に失敗しました

  14. 14

    C ++でのテンプレートの特殊化と関数のオーバーロード

  15. 15

    条件演算子を使用しているときにテンプレート化された値または関数を再帰的に計算するときのエラーC1202(スタックオーバーフロー)

  16. 16

    パラメーターC ++のタイプによってオーバーロードされたコンストラクターを特殊化します

  17. 17

    C ++テンプレート関数-複数のタイプ、デフォルトおよび...引数?

  18. 18

    []および=演算子をオーバーロードして、C ++でテンプレートクラスの値を受け入れる

  19. 19

    CおよびC ++コンパイラが、明示的に初期化されたグローバル変数とデフォルトで初期化されたグローバル変数を異なるセグメントに配置するのはなぜですか?

  20. 20

    C ++ 14のテンプレート化された関数の引数

  21. 21

    C ++エラー:タイプ 'double'および<未解決のオーバーロードされた関数タイプ 'からバイナリ'演算子 'への無効なオペランド

  22. 22

    テンプレートクラスのインスタンス化されたオブジェクトのC ++テンプレートメタ関数

  23. 23

    C ++関数テンプレートのオーバーロード:空の中括弧と明示的な整数

  24. 24

    C ++のオーバーロードされたコンストラクターを介して不明な型の変数を初期化する

  25. 25

    C ++のオーバーロードされたコンストラクターを介して不明な型の変数を初期化する

  26. 26

    コンストラクターでの完全な転送(C ++ 17)

  27. 27

    オーバーロードされた関数のC ++の複数のインスタンスが、ヘッダーファイルの作成時に引数リストと一致します

  28. 28

    テンプレート化されたクラスで/演算子をオーバーロードしようとしたC ++エラー

  29. 29

    C ++のテンプレートクラスと関数のオーバーロード

ホットタグ

アーカイブ