1

可変個引数テンプレートを使用して名前付き/型指定されたパラメーターを少しいじっており、次のクラスがあります。

class audio_source_t
{
public:

    virtual ~audio_source_t()
    {
    }

    template<typename T...>
    void receive(const T&... args)
    {
        auto tuple = std::tie(args...);

        receive_impl(std::get<boost::optional<sample_rate_t>>(tuple),
                     std::get<boost::optional<nb_channels_t>>(tuple));                   
    }

private:

    virtual void receive(audio_frame_t& destination,
                         const boost::optional<sample_rate_t>& sample_rate_hint = nullptr,
                         const boost::optional<nb_channels_t>& nb_channels_hint = nullptr) const;
};

パラメータの型は次のように定義されています。

template<typename T>
class explicit_class
{
public:
    explicit sample_rate_t(T value)
        : value_(value)
    {
    }

    explicit operator T()
    {
        return value_;
    }

private:
    T value_;
};

class sample_rate_t : public explicit_class<int>{};
class nb_channels_t : public explicit_class<int>{};

これまでのところ、次のようにクラスを使用できるようになりました。

audio_source.receive(boost::optional<sample_rate_t>(48000),
                     boost::optional<nb_channels_t >(2));

audio_source.receive(boost::optional<nb_channels_t>(2), 
                     boost::optional<sample_rate_t>(48000));

パラメータの順序は重要ではなく、明示的で優れています。

boost::optionalただし、オプションのパラメーターが実際にはオプションであり、指定されたパラメーターについて言及する必要がない場合はさらに良いでしょう。

audio_source.receive(sample_rate_t(48000), 
                     nb_channels_t(2));

audio_source.receive(nb_channels_t(2), 
                     sample_rate_t(48000));

audio_source.receive(sample_rate_t(48000));

audio_source.receive(nb_channels_t(2));

考えられるすべてのオーバーロードを単純に作成できることはわかっていますが、最大で +3 パラメーターになると、すぐに非現実的になります。

この改善を達成する方法について何か提案はありますか?

基本的に私が必要とするのは次のようなものです:

get_or_nullptr_t<sample_rate_t>(tuple)

コンパイル時に、タプルに型が含まれているかどうかを判断し、それ以外の場合はstd::nullptr_t().

4

0 に答える 0