I want to check if a given string is a valid UUID using boost.
This is what I have come up with by looking at the documentation on the boost website:
void validate_uuid(const std::string& value)
{
    try
    {
        boost::uuids::string_generator stringGenerator;
        (void)stringGenerator(value);
    }
    catch (const std::exception& ex)
    {
        // ...
    }
}
However, this does not always work.
If I call the function with a string that is too short for a valid UUID, an exception is thrown as expected. But if I call the function with an invalid UUID (e.g. 00000000-0000-0000-0000-00000000000K) no exception is thrown. 
Please can someone clarify why this is happening.
Also, I've seen the use of boost::lexical_cast to read a string as a UUID as posted here. I'm wondering if I should follow that approach. Any advice appreciated.
The code you had does nothing in terms of validation. Instead it generates a UUID based on the constant passed (like a hash function).
Looking closer I was mistaken. The missing bit of validation appears to be a check on version:
Live On Coliru
#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_io.hpp>
#include <boost/uuid/string_generator.hpp>
#include <iostream>
bool is_valid_uuid(std::string const& maybe_uuid, boost::uuids::uuid& result) {
    using namespace boost::uuids;
    try {
        result = string_generator()(maybe_uuid); 
        return result.version() != uuid::version_unknown;
    } catch(...) {
        return false;
    }
}
int main() {
    std::string maybe_uuid;
    std::cout << "Enter a UUID: ";
    while (std::cin >> maybe_uuid)
    {
        boost::uuids::uuid result;
        bool is_valid = is_valid_uuid(maybe_uuid, result);
        std::cout << "\n'" << maybe_uuid << "' valid: " << std::boolalpha << is_valid << "\n";
        if (is_valid)
            std::cout << "Parsed value: " << result << "\n";
    }
}
Sample output from Coliru: echo 00000000-0000-{0,4}000-0000-000000000000 $(uuidgen) "{$(uuidgen)}" | ./a.out:
Enter a UUID: 
'00000000-0000-0000-0000-000000000000' valid: false
'00000000-0000-4000-0000-000000000000' valid: true
Parsed value: 00000000-0000-4000-0000-000000000000
'a2c59f5c-6c9b-4800-afb8-282fc5e743cc' valid: true
Parsed value: a2c59f5c-6c9b-4800-afb8-282fc5e743cc
'{82a31d37-6fe4-4b80-b608-c63ec5ecd578}' valid: true
Parsed value: 82a31d37-6fe4-4b80-b608-c63ec5ecd578
                        This seems way easier:
#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_io.hpp>
#include <iostream>
#include <sstream>
int main()
{
    std::string t1("01234567-89ab-cdef-0123-456789abcdef");
    std::string t2("Test UUID");
    boost::uuids::uuid u;
    std::istringstream iss(t1);
    iss >> u;
    if (iss.good())
        std::cerr << "'" << t1 << "' is a good UUID\n";
    else
        std::cerr << "'" << t1 << "' is not a good UUID\n";
    iss.str(t2);
    iss >> u;
    if (iss.good())
        std::cerr << "'" << t2 << "' is a good UUID\n";
    else
        std::cerr << "'" << t2 << "' is not a good UUID\n";
    return 0;
}
$ g++ -I/usr/local/include -std=c++11 test1.cpp
$ a.out
'01234567-89ab-cdef-0123-456789abcdef' is a good UUID
'Test UUID' is not a good UUID
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With