函数和内部函数相同的参数

时间:2019-01-08 13:03:30

标签: c++ c++11 arduino

有人可以帮助我如何实现我的函数仅接受可以在函数内部调用的参数类型吗?

我有一个Logger类,可以从Arduino代码的HardwareSerial函数中的setup()对象开始。
然后在loop()中,我想调用Logger.print()函数,该函数仅接受可以调用HardwareSerial.print()的参数。

这是我的丑陋且不起作用的尝试:

template <typename... ARGS>
size_t print(const ARGS &... args) {
    if (serial != NULL) {
        if (sizeof...(args) == 2) {
            return this->serial->print(args[0], args[1]);
        } else if (sizeof...(args) == 1) {
            return this->serial->print(args[0]);
        }
    }
    return 0;
}

template <typename T>
size_t print(const T &t, typename std::enable_if<std::is_convertible<const __FlashStringHelper *, T>::value ||
                                                     std::is_base_of<const String &, T>::value ||
                                                     std::is_array<T>::value ||
                                                     //std::is_same<char[std::extent<T>::value], T>::value ||
                                                     std::is_same<char, T>::value ||
                                                     std::is_same<char *, T>::value ||
                                                     std::is_same<const char *, T>::value ||
                                                     std::is_same<unsigned char, T>::value ||
                                                     std::is_same<int, T>::value ||
                                                     std::is_same<unsigned int, T>::value ||
                                                     std::is_same<long, T>::value ||
                                                     std::is_same<unsigned long, T>::value ||
                                                     std::is_same<double, T>::value ||
                                                     std::is_convertible<const Printable &, T>::value ||
                                                     std::is_convertible<struct tm *, T>::value,
                                                 T>::type * = 0) {
    if (serial != NULL) {
        return this->serial->print(t);
    }
    retrun 0;
}

3 个答案:

答案 0 :(得分:2)

当您使用mvn clean install进行SFINAE检查时,确定是否可以调用函数很简单:

decltype

答案 1 :(得分:0)

可变参数模板扩展的语法是

template <typename... ARGS>
size_t print(const ARGS&... args) {
    if (serial != nullptr) {
        return this->serial->print(args...);
    }
    return 0;
}

要使其对SFINAE友好,可以使用:

template <typename... ARGS>
auto print(const ARGS&... args) -> decltype(this->serial->print(args...))
{
    if (serial != nullptr) {
        return this->serial->print(args...);
    }
    return 0;
}

答案 2 :(得分:0)

由于您希望使用与HardwareSerial相同的接口,并具有所有printprintlnwrite方法,因此您的Logger类应继承自{{ 1}},然后仅实现只调用Print的{​​{1}}的{​​{1}}方法。

write(uint8_t)
HardwareSerial

有关write(uint8_t)类的更多信息:https://playground.arduino.cc/Code/Printclass