SFINAE将实例化类型限制为std :: chrono :: duration类型

时间:2017-11-03 00:12:58

标签: c++ c++11

我想做点什么

template <typename T>
class TemporalAlarmDelay<T, std::enable_if<std::is_base_of<std::chrono::duration< , >, T>::value, T>::type>
{
public:
    explicit TemporalAlarmDelay(T delay)
        : mDelay(delay)
    {

    }

private:
    T mDelay;
    std::chrono::steady_clock::time_point mTriggerTime;
};


int main(int argc, char** args)
{
    TemporalAlarmDelay<std::chrono::nanoseconds> nanosecondDelay;   // this should work
    TemporalAlarmDelay<std::chrono::milliseconds> millisecondDelay; // this should work 
    TemporalAlarmDelay<std::chrono::seconds> secondDelay;           // this should work
    TemporalAlarmDelay<int> failDelay;                              // fail to instantiate
}

目的是限制std::chrono::duration的类型(例如std::chrono::millisecondsstd::chrono::seconds)。最好的方法是什么?根据我的例子,我以为我可以使用std::is_base_of,但我现在意识到帮助器类型(例如std::chrono::millisecondsstd::chrono::seconds等)不使用继承 - derrr,真是太傻了思想。

4 个答案:

答案 0 :(得分:2)

您可以使用模板专业化:

template <typename T>
class TemporalAlarmDelay
{
    ~TemporalAlarmDelay() = delete; // prevent instantiation
};

template <typename R, typename P>
class TemporalAlarmDelay<std::chrono::duration<R, P>>
{
    // your code
};

@ Jarod42建议你甚至可以逃脱:

template <typename> class TemporalAlarmDelay;

而不是上面的前四行。

答案 1 :(得分:2)

您可以创建特征:

template <typename T> struct is_chrono_duration : std::false_type {};

template <typename R, typename P>
struct is_chrono_duration<std::chrono::duration<R, P>> : std::true_type {};

然后:

template <typename T>
class TemporalAlarmDelay
{
    static_assert(is_chrono_duration<T>::value, "!");
    // your code
};

答案 2 :(得分:1)

对于你问题的最简单的解决方案......

plugins.push(new HtmlWebpackPlugin({
    template: 'index.html',
    hash: true
})/*, new OpenBrowserPlugin({ 
    url: `http://localhost:${port}`
})*/);

答案 3 :(得分:0)

从Jarod42的[{'a': 1, 'b': 0}, {'a': 1, 'b': 1}, {'a': 1, 'b': 2}] 中获取灵感(嗯......复制它,说实话),可能基于SFINAE(超过默认布尔值)解决方案

is_chrono_duration

以下是完整的编译示例

template <typename T, bool = is_chrono_duration<T>::value>
class TmpAlrD;

template <typename T>
class TmpAlrD<T, true>
 {
   // ...
 };