我想做点什么
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::milliseconds
,std::chrono::seconds
)。最好的方法是什么?根据我的例子,我以为我可以使用std::is_base_of
,但我现在意识到帮助器类型(例如std::chrono::milliseconds
,std::chrono::seconds
等)不使用继承 - derrr,真是太傻了思想。
答案 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>
{
// ...
};