template <typename T, typename ResultType = void, typename = void>

struct check_traced_value_support

Helpers to check whether a given type T can be written into a TracedValue /

TracedProto

<MessageType

>.

Intended to be used for types like smart pointers, who should support

WriteIntoTrace only iff their inner type supports being written into

a TracedValue.

template

<typename

T>

class SmartPtr {

...

// Note: |Check| is needed to ensure that using

SmartPtr

<ClassWhichDoesNotSupportTracedValue

> does not generate a

compilation error.

template

<typename

Check=void>

typename check_traced_value_support

<T

, Check>::value

WriteIntoTrace(perfetto::TracedValue context) const {

WriteIntoTracedValue(std::move(context), *ptr_);

}

template

<typename

MessageType>

typename check_traced_value_support

<T

, MessageType>::value

WriteIntoTrace(perfetto::TracedProto

<MessageType

> message) const {

WriteIntoTracedProto(std::move(message), *ptr_);

}

};